Поиск словарей, в которых нет запрещенных пар ключ-значение

У меня есть следующие два списка:

List1 =
[
{"color":"red",
"size":"large"},

{"color":"blue",
"size":"medium"}
]

List2 =
[
{"color":"red",
"size":"large"},

{"color":"blue",
"size":"medium"},

{"color":"yellow",
"size":"small"}
]

Что мне нужно, так это третий список, который содержит только разницу между List1 и List2, сравнивая только «цветовые» ключи, а не весь словарь. Например, учитывая два приведенных выше списка, я ожидаю что-то вроде:

List3 =
[
    {"color":"yellow",
    "size":"small"}
]

У меня есть функция, которая возвращает список словарей. Эти словари содержат информацию об устройствах, подключенных в данный момент к сети.

Мне нужен список устройств, которые подключались к сети с момента последней проверки, используя MAC-адреса устройств.

Причина, по которой я не могу сравнить все словари, заключается в том, что внутри них есть переменная, которая ВСЕГДА изменяется.

Сделать это непросто, так как сравнивать dict друг с другом сложно. Содержит ли каждый из них определенные ключи, которые вы уже знаете, или это их общий список?

Eric Jin 10.04.2022 19:28

Можно ли преобразовать ваши списки в настоящий dict или у вас могут быть дубликаты «цветов» внутри одного из каждого списка?

Floh 10.04.2022 19:32

Я голосую за закрытие этого вопроса, потому что ОП должен проявить некоторые усилия.

Abhijit Sarkar 10.04.2022 20:25
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
3
42
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для представленных вами данных вы можете создать набор ключей для сравнения в каждом списке и сравнить полученные наборы с symmetric_difference.

compare = 'color'
colors1 = {d.get(compare) for d in List1}
colors2 = {d.get(compare) for d in List2}

# {'yellow'}
difference = colors1.symmetric_difference(colors2)

# [{'color': 'yellow', 'size': 'small'}]
result = [d for d in List1 + List2 if d.get(compare) in difference]

difference - вы имели в виду diff ?
SergFSM 10.04.2022 20:29

Вы можете получить набор цветов, которых следует избегать в результате, используя functools.reduce(), а затем использовать понимание списка, чтобы сохранить только те ключи, которые не имеют цвета в этом наборе:

colors_to_avoid = reduce(lambda x, y: x | {y["color"]}, List1, set())
result = [item for item in List2 if item["color"] not in colors_to_avoid]

print(result)

Это выводит:

[{'color': 'yellow', 'size': 'small'}]

Это создает пустой список, если {'color': 'yellow', 'size': 'small'} находится в List1 вместо List2

Mark 10.04.2022 19:41

Это ожидаемое поведение? ОП сказал «разница», которую я принял за разницу в наборе, а не симметричную разницу.

BrokenBenchmark 10.04.2022 19:46

Хм. Может быть, вы правы. Я прочитал это по-другому.

Mark 10.04.2022 20:05
Ответ принят как подходящий

Я бы использовал модуль pandas:

import pandas as pd

List1 =[{"color":"red","size":"large"},
        {"color":"blue","size":"medium"},
        {"color":"black","size":"medium"}]

List2 =[{"color":"red","size":"small"},
        {"color":"blue","size":"medium"},
        {"color":"yellow","size":"small"}]

List3 = pd.DataFrame(List1+List2).drop_duplicates('color', False).to_dict('records')
'''
[{'color': 'black', 'size': 'medium'}, {'color': 'yellow', 'size': 'small'}]

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