Python:添加字典项。

-2 投票
3 回答
1122 浏览
提问于 2025-04-16 06:36

当我们添加字典的项目时,

我们使用 x.items()+y.items(),但有些地方我不太明白。

比如说,

如果 x={2:2,1:3}y={1:3,3:1},那么 x.items()+y.items() 的结果是 {3:1,2:2,1:3}

所以,正如你所看到的,数学上答案本来可以是 6x+2x^2+x^3

但字典给出的却是 x^3+2x^2+3x

有没有人能告诉我有什么更好的方法可以用呢?

3 个回答

1

你可以创建一个自己的字典子类,来实现加法操作符,让它按照你想要的方式工作:

import copy
class AddingDict(dict):
    def __add__(self, d2):
        new_dict = copy.deepcopy(self)
        for key, value in d2.iteritems():
            if key in new_dict:
                new_dict[key] += value
            else:
                new_dict[key] = value
        return new_dict

现在:

>>> x = AddingDict({2:2,1:3})
>>> y = AddingDict({1:3,3:1})
>>> x+y
{1: 6, 2: 2, 3: 1}

编辑

如果你需要更高的效率,检查每个键是否在 new_dict 中,对于原始字典中的每个键来说,这样做效率不高。你可以把每个键的列表转换成一个 set(集合),然后找出它们的交集,但这样代码会变得更复杂,而且效率提升可能也不太必要。具体的实现留给读者自己去练习。

3

当你调用 dict(x.items()+y.items()) 时,如果有重复的键,后面的值会覆盖前面的值,也就是说,最后的值是来自 y 的。

因为在Python的字典中,键和值可以是任何东西(只要键是可以哈希的),那么当一个键被替换时,Python是怎么知道该怎么处理旧值和新值的呢?

在Python 2.7和3中,有一个叫 Counter 的字典子类,它的值只能是数字。当你把两个 Counter 加在一起时,它会把重复键的值加起来:

>>> from collections import Counter
>>> Counter({2:2,1:3}) + Counter({1:3,3:1})
Counter({1: 6, 2: 2, 3: 1})
5

让我们来搞清楚这里发生了什么!

In [7]: x.items()
Out[7]: [(1, 3), (2, 2)]

In [8]: y.items()
Out[8]: [(1, 3), (3, 1)]

In [9]:  x.items() + y.items()
Out[9]: [(1, 3), (2, 2), (1, 3), (3, 1)]

In [10]: dict(x.items() + y.items())
Out[10]: {1: 3, 2: 2, 3: 1}

items()这个函数会生成一个包含(键,值)对的列表,而+符号则是把这些列表连接在一起。然后你可以把这个列表再转回字典,字典会处理重复的键,规则是会保留最后一个出现的值。因为这次是重复的值,所以不影响结果,但在其他情况下可能会有影响:

In [11]: z = {1:4, 3:1}

In [12]: dict(x.items() + z.items())
Out[12]: {1: 4, 2: 2, 3: 1}

在这种情况下,1:3这个条目会被丢弃……

(不太明白你提到的多项式是什么情况……如果你真的想表示可以进行算术加法的多项式,建议你看看numpy库中的poly1d类,或者@adw提到的collections.Counter。)

撰写回答