сравнение двух словарей со значениями типа списка - PullRequest
2 голосов
/ 21 февраля 2011

Я пытаюсь сравнить два словаря. Мой подход состоит в том, чтобы превратить их в два отдельных списка кортежей и затем использовать модуль set. Вот иллюстрация:

dict = {'red':[1,2,3],'blue':[2,3,4],'green':[3,4,5]}

dict1 = {'green':[3,4,5],'yellow':[2,3,4],'red':[5,2,6]}

intersection = set(set(dict.items()) & set(dict1.items()))

очевидно, это сравнение двух списков кортежей, и python не нравится. Я получаю ошибку TypeError: 'list' - неустранимая ошибка (или аналогичная формулировка).

Я бы хотел, чтобы пересечение содержало [('green',[3,4,5])]. Есть идеи?

Ответы [ 2 ]

6 голосов
/ 21 февраля 2011
shared_keyvals = dict( (key, dict1[key])
                       for key in (set(dict1) & set(dict2))
                       if dict1[key] == dict2[key]
                     )

Вы даже можете превратить это в функцию:

def shared_keyvals(dict1, dict2):
    return dict( (key, dict1[key])
                 for key in (set(dict1) & set(dict2))
                 if dict1[key] == dict2[key]
               )

Очевидно, что если вы предпочитаете не выводить данные в виде словаря, вы можете просто удалить вызов dict() и заменить навместо скобок для понимания списка ([]).

2 голосов
/ 21 февраля 2011

Списки изменчивы и, следовательно, не могут быть хэшируемыми.Набор может быть построен только из хэшируемых предметов.Так как значения в двух диктовках выше являются списками, наборы не могут быть построены из них.Однако, если нужно изменить тип значений со списков на кортежи (которые являются неизменяемыми), можно создавать наборы и выполнять операции над множествами.

>>> dict1 = {'blue': (2, 3, 4), 'green': (3, 4, 5), 'red': (1, 2, 3)}
>>> dict2 = {'green': (3, 4, 5), 'yellow': (2, 3, 4), 'red': (5, 2, 6)}
>>> list(set(dict1.items()) & set(dict2.items()))
[('green', (3, 4, 5))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...