假设您的列表中没有重复项,则可以使用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
中存在的键的情况
编辑 - 使用 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]}
编辑 - 删除第二个集合:
正如Padraic Cunningham在评论中提到的那样(他常常这样做,上帝保佑他的灵魂),你可以利用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]}
虽然我觉得这有点笨拙,而且我并不是很喜欢它。