蟒蛇。如何减去2个词典

时间:2016-02-03 20:34:51

标签: python dictionary subtraction

我有2个词典,A和B. A有700000个键值对,B有560000个键值对。来自B的所有键值对都存在于A中,但A中的某些键是具有不同值的重复项,而某些键具有重复值但是唯一键。我想从A中减去B,所以我可以得到剩余的140000个键值对。当我根据键标识减去键值对时,由于重复键,我删除了150000个键值对。我想根据每个键值对的BOTH键和值的标识减去键值对,所以我得到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}

9 个答案:

答案 0 :(得分:16)

根据键:

获取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]}

答案 1 :(得分:11)

一种简单直观的方法是

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

答案 2 :(得分:2)

使用集合效率的另一种方式。这个可能@brien的答案更具多功能性。他的答案非常简洁,所以我对它进行了投票。

command = parser.add_subparsers(title='command', dest='command')
command.add_parser('command1', help='Foo all your bars')
command.add_parser('command2', help='Bar all your foos')
编辑:根据OP的问题,这里假设dict B是dict A的一个子集,B中的key / val对在A中。上面的代码会有意想不到的结果如果你没有严格使用key / val子集。感谢史蒂文在评论中指出这一点。

答案 3 :(得分:2)

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}

答案 4 :(得分:2)

dict-views

<块引用>

键视图是类似设置的,因为它们的条目是唯一且可散列的。如果所有值都是可散列的,因此 (key, value) 对是唯一且可散列的,则项目视图也是类似设置的。 (值视图不被视为类集合,因为条目通常不是唯一的。)对于类集合视图,为抽象基类 collections.abc.Set 定义的所有操作都可用(例如,==、< , 或 ^).

所以你可以:

>>> A = {'10':1, '11':1, '12':1, '10':2, '11':2, '11':3}
>>> B = {'11':1, '11':2}
>>> A.items() - B.items()
{('11', 3), ('12', 1), ('10', 2)}
>>> dict(A.items() - B.items())
{'11': 3, '12': 1, '10': 2}

对于 python 2 使用 dict.viewitems

P.S. dict 中不能有重复的键。

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

答案 5 :(得分:1)

result = A.copy()
[result.pop(key) for key in B if B[key] == A[key]]

答案 6 :(得分:1)

由于我无法(尚未)发表评论:如果B中的某些键不在A中,那么接受的answer将失败。

将dict.pop与默认值结合使用会绕开它(从How to remove a key from a Python dictionary?借来):

all(A.pop(k, None) for k in B)

tuple(A.pop(k, None) for k in B)

答案 7 :(得分:1)

要减去字典,您可以执行以下操作:

A.subtract(B)

注意:在B拥有A所没有的键的情况下,这将为您提供负值。

答案 8 :(得分:-1)

仅基于假设A是B的超集或B是A的子集的键:

c = {k:a[k] for k in a.keys() - b.keys()}

基于键和值@PaulMcG答案