Сравните два списка с dicts и распечатайте значение, которого нет в списке, используя Python? - PullRequest
1 голос
/ 28 апреля 2019

Я пытался сыграть в abit с двумя списками, включающими дикты. В основном у меня есть два списка, которые следующие:

listA = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorB', 'color': 'Blue'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]
listB = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]

Здесь я пытаюсь добиться того, чтобы я хотел сравнить список A со списком B и распечатать все, чего нет в списке B, из списка A. В нашем случае у нас нет {'name': 'ColorB', 'color': 'Blue'} в listB, что означает, что в этом случае вывод будет:

{'name': 'ColorB', 'color': 'Blue'}

Однако я не нашел ничего похожего на мою проблему из-за того, что у меня есть "запятая" внутри dict. (может быть, это не правильно диктует ??)

Буду признателен за любую помощь в решении моей проблемы распечатки сообщений, которых нет в списке B.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2019

вы можете решить эту проблему со сложностью O(n^2), используя in в цикле (как в this answer), но вы также можете перестроить listB как набор tuplesчтобы уменьшить сложность до O(n) (необходимо преобразовать словари в кортежи, чтобы их можно было добавлять в set):

listA = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorB', 'color': 'Blue'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]
listB = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]

listB = {tuple(x.items()) for x in listB}

difference = [A for A in listA if tuple(A.items()) not in listB]

результат:

>>> difference
[{'color': 'Blue', 'name': 'ColorB'}]

tuple(A.items()) not in listBдолжен каждый раз создавать tuple, но после этого операция not in будет O(1)

2 голосов
/ 28 апреля 2019

Все просто. Используйте loop для итерации каждого элемента в listA и if-Statement для сравнения его со всеми элементами в listB:

listA = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorB', 'color': 'Blue'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]
listB = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]

for A in listA:
    if A not in listB:
        print(A)

Выход:

{'name': 'ColorB', 'color': 'Blue'}
1 голос
/ 28 апреля 2019
>>> listA = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorB', 'color': 'Blue'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]
>>> listB = [{'name': 'ColorR', 'color': 'Red'}, {'name': 'ColorP', 'color': 'Purple'}, {'name': 'ColorO', 'color': 'Orange'}, {'name': 'ColorW', 'color': 'White'}]
>>> [item for item in listA if item not in listB]
[{'name': 'ColorB', 'color': 'Blue'}]
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...