Python:添加字典项。

时间:2010-11-05 14:39:01

标签: python dictionary

当我们添加字典项目时,

我们使用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 个答案:

答案 0 :(得分: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类{{3}或@adw所描述的collections.Counter。)

答案 1 :(得分:2)

当你致电dict(x.items()+y.items())时,重复的密钥只会被设置两次,而最新的设定值(来自y的那个)会覆盖旧的(来自x)。

由于Python字典可以包含任何键作为其键或值(只要键可以清除),当键被替换时,它如何知道如何组合旧值和新值?

在Python 2.7和3中,有一个名为Counter的字典子类,它只能将数字作为值。当你将其中两个加在一起时,确实将这些值一起添加到重复键中:

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

答案 2 :(得分:1)

您可以创建自己的dict子类来实现add运算符以执行您想要的操作:

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并取得交叉点,但代码会更复杂,可能不需要效率。实际的实施留给读者练习。