Ответ 1
Предполагая, что в любом из ваших списков не будет повторяющихся записей, вы можете делать то, что хотите, с set
, но не со списками:
>>> a = {'joe': [24,32,422], 'bob': [1,42,32,24], 'jack':[0,3,222]}
>>> b = {'joe': [24], 'bob': [1,42,32]}
>>> {key: list(set(a[key])- set(b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}
Обратите внимание на две вещи:
- Я конвертирую набор обратно в список, когда я устанавливаю его как значение
- Я использую
b.get
вместоb[key]
для обработки, если ключ не существует вb
, но вa
EDIT - использование цикла for:
Я понял, что понимание может быть не таким понятным, поэтому это эквивалентный бит кода, использующий цикл for:
>>> c = {}
>>> for key in a:
c[key] = list(set(a[key]) - set(b.get(key,[])))
>>> c
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}
РЕДАКТИРОВАТЬ - потерять второй набор:
Как упоминал Падрейк Каннингем в комментариях (как он часто это делает, благослови его душу), вы можете использовать set.difference
, чтобы избежать явного включения второго списка в набор:
>>> c = {}
>>> for key in a:
c[key] = list(set(a[key]).difference(b.get(key,[])))
>>> c
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}
или со списком:
>>> {key: list(set(a[key]).difference(b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}
или если вы хотите рассматривать set.difference
как метод класса вместо метода экземпляра:
>>> {key: list(set.difference(set(a[key]),b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}
Хотя я нахожу это немного неудобным, и мне это не очень нравится.