蟒蛇.如何减去2个词典

Luc*_*cas 6 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}
Run Code Online (Sandbox Code Playgroud)

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

我不想得到:

a)基于密钥时:

{'10':1, '12':1, '10':2}
Run Code Online (Sandbox Code Playgroud)

要么

b)基于价值观:

{'11':3}
Run Code Online (Sandbox Code Playgroud)

Pau*_*McG 23

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

C = {k:v for k,v in A.items() if k not in B}
Run Code Online (Sandbox Code Playgroud)

要根据键和值获取A中不在B中的项目:

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

  • 这是最符合逻辑/可读的,而且可能是最快的,并且可以轻松调整值是否必须相等(或只是键相等)。 (2认同)

Bri*_*ien 11

一种简单,直观的方法是

dict(set(a.items()) - set(b.items()))
Run Code Online (Sandbox Code Playgroud)

  • 当任何值不可清除时,这将不起作用. (5认同)
  • _如果将列表存储在字典中,则会遇到问题_ -> 这在从 JSON 派生的字典中很常见。 (4认同)
  • @HuckIt如果将列表存储在字典中,则会遇到问题 (2认同)

Mon*_*yor 5

A = {'10':1, '11':1, '12':1, '10':2, '11':2, '11':3}
B = {'11':1, '11':2}
Run Code Online (Sandbox Code Playgroud)

您在Python中不能有重复的键。如果执行上述操作,它将减少为:

A={'11': 3, '10': 2, '12': 1}
B={'11': 2}
Run Code Online (Sandbox Code Playgroud)

但是要回答您的问题,请执行A-B(基于字典键):

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

  • 我会避免仅出于其副作用使用“ map”,并避免使用“ all”来强制评估。如果您的任何一个值是错误的,`all`会过早停止从A弹出值!通常,命令式for循环没有什么问题,在这种情况下,PaulMcG的非变异性理解答案似乎是最好的解决方案。 (3认同)
  • @mpb,不错!必须将其放在all()之类的东西中以消耗迭代器。适用于Python 2和3 (2认同)