У меня есть два списка словарей Python. Я хочу создать новый список похожих словарей на основе разницы между list1 и list2, используя ключевое значение «фрукты». Ни один из словарей в любом списке не является идентичным.
list1 = [
{'fruit': 'apple', 'amt': '1'},
{'fruit': 'banana', 'amt': '2'},
{'fruit': 'cherry', 'amt': '3'},
{'fruit': 'date', 'amt': '4'},
{'fruit': 'elderberry', 'amt': '5'},
]
list2 = [
{'fruit': 'date', 'amt': '6'},
{'fruit': 'elderberry', 'amt': '7'},
]
list3 = [some kind of python list comprehension]
print(list3)
{'fruit': 'apple', 'amt': '1'}
{'fruit': 'banana', 'amt': '2'}
{'fruit': 'cherry', 'amt': '3'}
Какой именно критерий? Это слова в list1
, у которых нет совпадений в list2
, или это слова в обоих списках, у которых нет совпадений в другом?
печать (list3) дает пример вывода, которого я пытаюсь достичь. Я написал псевдокод, чтобы проиллюстрировать цель, а не объяснить ее.
@PinAppleRedbull а что, если list2
также содержит {'fruit': 'fig', 'amt': 8}
? Должен ли этот элемент появиться в результате?
Итак, вам нужны все словари, которые есть в list1
, если в list2
нет ничего с таким же названием фрукта? Возможно ли, что в list2
может быть фрукт, которого нет в list1
, и если да, то хотели бы вы, чтобы он появился в результате?
Это немного неэффективно, но это работает, чтобы проверить.
def find_dif (l1, l2, check_value):
l3 = l1.copy()
for i in l1:
for z in l2:
if i[check_value] == z[check_value]:
l3.remove(i)
return l3
он принимает два списка диктов, а затем проверяет каждое значение по сравнению с другим списком. затем он выталкивает эти значения из первого списка, а затем возвращает это. Обновлено: он возвращает сумму из первого списка.
Немного неясно, хотите ли вы, чтобы list3
содержал словари только из list1
, если их нет в list2
, или также из list2
, если их нет в list1
.
Но в основном вам нужна разница или симметричная разница словарей в list1
и list2
на основе значений в ключе fruit
.
Разность содержит элементы, которые существуют только в первом наборе, а не в обоих наборах.
Если бы в ваших списках были только значения fruit
, вы могли бы создать наборы из них и сделать разницу, используя встроенную функцию Python: list1.difference(list2)
. Но так как это словари с ключами-значениями, которые мы хотим игнорировать, вам нужно сделать это вручную. Понимание списка работает:
list3 = [x for x in list1 if x['fruit'] not in [y['fruit'] for y in list2]]
т.е. для элементов в list1
вернуть элемент, если его fruit
нет в списке fruit
из list2
.
Симметричная разность содержит набор элементов, отсутствующих в обоих наборах.
Понимание списка в основном одинаково, но выполняется в обоих направлениях list1.difference(list2) + list2.difference(list1)
:
list3 = [x for x in list1 if x['fruit'] not in [y['fruit'] for y in list2]] + [x for x in list2 if x['fruit'] not in [y['fruit'] for y in list1]]
Хорошо, в чем вопрос? Как я могу вам помочь? Если вы еще не пытались решить проблему самостоятельно, сделайте это в первую очередь. См. Как спросить.