zakładając, że nie będzie nie twórz żadnych duplikatów na żadnej z twoich list, możesz robić, co chcesz, przy pomocy set
s, ale nie z listami:
>>> 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]}
Note dwie rzeczy:
- przekonwertować zestaw z powrotem do listy kiedy ustawić ją jako wartość
- używam
b.get
zamiast b[key]
obsłużyć jeśli klucz nie istnieje w b
, ale nie w a
EDIT - za pomocą pętli:
zdałem sobie sprawę, że rozumienie nie może być tak, że wymowne więc jest to odpowiednik kawałek kodu za pomocą pętli 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]}
EDIT - stracić drugiego zestawu:
Jak Padraic Cunningham mowa w komentarze (jak to często robi, błogosław jego duszę), można skorzystać z set.difference
uniknąć wyraźnie odlewania swoją drugą listę do zestawu:
>>> 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]}
lub z listowego:
>>> {key: list(set(a[key]).difference(b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}
lub jeśli chcesz traktować set.difference
jako metoda klasy zamiast metody instancji:
>>> {key: list(set.difference(set(a[key]),b.get(key,[]))) for key in a}
{'joe': [32, 422], 'bob': [24], 'jack': [0, 3, 222]}
Choć uważam to nieco tad niezgrabne, a ja nie lubię go tak samo.
Chciałbym podkreślić, że odpowiedzi w użyciu zestawów które są rzucane z powrotem na listy, niszczą kolejność list (jeśli kolejność nie zostanie zmieniona dla konkretnego przykładu, to zbieg okoliczności). Ponieważ twoje specyfikacje nie mówią, że kolejność list jest nieistotna, myślę, że należy to odnotować. – timgeb