【问题标题】:How to subtract values from dictionaries如何从字典中减去值
【发布时间】:2013-07-16 08:43:42
【问题描述】:

我在 Python 中有两个字典:

d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}

我想在字典 d1-d2 之间减去值并得到结果:

d3 = {'a': 9, 'b': 7, 'c': 5, 'd': 7 }

现在我使用两个循环,但这个解决方案不是太快

for x,i in enumerate(d2.keys()):
        for y,j in enumerate(d1.keys()):

【问题讨论】:

标签: python dictionary


【解决方案1】:

我认为一种非常 Pythonic 的方式是使用 dict comprehension:

d3 = {key: d1[key] - d2.get(key, 0) for key in d1}

请注意,这只适用于 Python 2.7+ 或 3。

【讨论】:

  • 这是最快的解决方案。使用两个字典进行性能测试,每个字典包含 100 万个元素。
  • 您实际上并不需要最后的.keys()
  • 另外,对于任何想要删除 0 或更小的密钥的人,您可以将其修改为:{key: d1[key]-d2.get(key, 0) for key in d1 if d1[key]-d2.get(key, 0)>0}
【解决方案2】:

只是 Haidro 答案的更新。

推荐使用减法代替“-”。

d1.subtract(d2)

当使用 - 时,只有正数计数器会更新到字典中。 请参阅下面的示例

c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
a = c-d
print(a)        # --> Counter({'a': 3})
c.subtract(d)
print(c)        # --> Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

请注意,使用减法时字典会更新。

最后使用 dict(c) 从 Counter 对象中获取 Dictionary

【讨论】:

  • 您介意我将其添加到我的答案中吗?我会参考你的:)
  • 实际上,在测试这个时,它没有返回 OP 想要的字典。这将返回 e = -2,其中 OP 只想删除 e
  • 而且,虽然不是大问题,但它不会返回减去的字典(但实际上,我认为这无关紧要)
  • 还要注意subtract可以处理dict类型,所以不需要转换d
  • Yessss 终于需要这段代码来做底片了!
【解决方案3】:

使用collections.Counter,如果已知所有结果​​值都是严格正数。语法很简单:

>>> from collections import Counter
>>> d1 = Counter({'a': 10, 'b': 9, 'c': 8, 'd': 7})
>>> d2 = Counter({'a': 1, 'b': 2, 'c': 3, 'e': 2})
>>> d3 = d1 - d2
>>> print d3
Counter({'a': 9, 'b': 7, 'd': 7, 'c': 5})

请注意,如果不是所有值都已知严格保持积极:

  • 值为零的元素将在结果中被忽略
  • 值变为负数的元素将丢失,或替换为错误值。例如,print(d2-d1) 可以产生 Counter({'e': 2})

【讨论】:

  • ...我不知道你可以用 Counter O.O 做到这一点
  • @alvas collections.Counter 不支持除法/乘法
  • 我认为这比公认的答案更 Pythonic
  • 这里唯一的否定就是如果结果为负就不行
  • 我不记得了。 collections.Counter() 也适用于浮点数吗?
【解决方案4】:

Haidro 发布了一个简单的解决方案,但即使没有 collections,您也只需要一个循环:

d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}
d3 = {}

for k, v in d1.items():
    d3[k] = v - d2.get(k, 0) # returns value if k exists in d2, otherwise 0

print(d3) # {'c': 5, 'b': 7, 'a': 9, 'd': 7}

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多