Отфильтруйте два списка похожих словарей Python, используя ключевые значения

У меня есть два списка словарей 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'}

Хорошо, в чем вопрос? Как я могу вам помочь? Если вы еще не пытались решить проблему самостоятельно, сделайте это в первую очередь. См. Как спросить.

wjandrea 14.04.2023 20:41

Какой именно критерий? Это слова в list1, у которых нет совпадений в list2, или это слова в обоих списках, у которых нет совпадений в другом?

wjandrea 14.04.2023 20:45

печать (list3) дает пример вывода, которого я пытаюсь достичь. Я написал псевдокод, чтобы проиллюстрировать цель, а не объяснить ее.

PinAppleRedbull 14.04.2023 20:47

@PinAppleRedbull а что, если list2 также содержит {'fruit': 'fig', 'amt': 8} ? Должен ли этот элемент появиться в результате?

slothrop 14.04.2023 20:50

Итак, вам нужны все словари, которые есть в list1, если в list2 нет ничего с таким же названием фрукта? Возможно ли, что в list2 может быть фрукт, которого нет в list1, и если да, то хотели бы вы, чтобы он появился в результате?

CrazyChucky 14.04.2023 21:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это немного неэффективно, но это работает, чтобы проверить.

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]]

Другие вопросы по теме