Python, разница между списками диктов при сравнении разных полей - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть два разных списка со словарями:

first = [{'id': '1'}, {'id': '2'}, {'id': '3'}]

second = [{'user_id': '1'}, {'user_id': '2'}]

Я хочу что-то вроде:

# This is pseudocode 
first (id) - second (user_id) = [{'id': '3'}]

Возможно ли это на Python?

Я знаю, что этовозможно с помощью нескольких операторов цикла, но есть ли более элегантный способ решения этой проблемы, например, использование лямбда-выражений или что-то еще?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Один из способов - использовать понимание вложенного списка следующим образом:

In [9]: [d1 for d1 in first if not any(d2['user_id'] == d1['id'] for d2 in second)]
Out[9]: [{'id': '3'}]

Но в качестве более Pythonic способа лучше использовать операции над множествами и понимание списка:

In [13]: f = {d['id'] for d in first}

In [14]: s = {d['user_id'] for d in second}

In [15]: result = [{'id': i} for i in f - s]

In [16]: result
Out[16]: [{'id': '3'}]
0 голосов
/ 26 апреля 2018

Это один из подходов.Использование list comprehension и lambda.

first = [{'id': '1'}, {'id': '2'}, {'id': '3'}]
second = [{'user_id': '1'}, {'user_id': '2'}]

checkVal = map(lambda d: d['user_id'], second)
print([i for i in first if i["id"] not in checkVal])

Вывод:

[{'id': '3'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...