Python。如何减去两本词典

2024-03-29 01:44:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个字典,A和B。A有700000个键值对,B有560000个键值对。来自B的所有键值对都存在于A中,但是A中的一些键是具有不同值的重复键,一些键具有重复值但具有唯一键。我想从A中减去B,这样就可以得到剩下的140000个键值对。当我基于键标识减去键值对时,我删除了let,比如说150000个键值对,因为这些键是重复的。我想根据每个键值对的键和值的标识减去键值对,所以我得到140000。欢迎提出任何建议。

这是一个例子:

A = {'10':1, '11':1, '12':1, '10':2, '11':2, '11':3}
B = {'11':1, '11':2}

我想得到: A-B={'10':1,'12':1,'10':2,'11':3}

我不想得到:

a)当基于键时:

{'10':1, '12':1, '10':2}

或者

b)当基于值时:

{'11':3}

Tags: 字典建议标识例子键值let
3条回答
A = {'10':1, '11':1, '12':1, '10':2, '11':2, '11':3}
B = {'11':1, '11':2}

在Python中不能有重复的键。如果运行上面的命令,它将减少为:

A={'11': 3, '10': 2, '12': 1}
B={'11': 2}

但要回答你的问题,做A-B(基于dict键):

all(map( A.pop, B))   # use all() so it works for Python 2 and 3.
print A # {'10': 2, '12': 1}

要获取A中不在B中的项,仅基于键:

C = {k:v for k,v in A.items() if k not in B}

要在A中获取不在B中的项,请基于键和值:

C = {k:v for k,v in A.items() if k not in B or v != B[k]}

要更新就地(如A -= B)请执行以下操作:

from collections import deque
consume = deque(maxlen=0).extend
consume(A.pop(key, None) for key in B)

(与对A.pop使用map()不同,如果a中不存在来自B的键,则使用无默认值调用A.pop不会中断。此外,与使用all不同,此迭代器使用者将遍历所有值,而不管弹出值的真实性如何。)

一个简单直观的方法是

dict(set(a.items()) - set(b.items()))

相关问题 更多 >