我想用2个python词典构建一个列表,它们具有相同的键,但键的值不同

时间:2017-10-09 16:06:29

标签: python python-2.6

我有词典列表:

a1 = [{'x1': 1, 'x2': 2, 'x3': 3}]
a2 = [{'x1': 2, 'x2': 3, 'x3': 4}]

我需要将两个列表组合成第三个列表,如:

a3 = [{'x1': 3, 'x2': 5, 'x3': 7}]

我用Google搜索并发现较新版本的Python具有collection.Counter s的概念,但我正在处理Python 2.6.4并且不支持collections.Counters

5 个答案:

答案 0 :(得分:4)

您可以对Python dicts使用字典理解:

a1 = {'x1':1, 'x2':2, 'x3':3}
a2 = {'x1':2, 'x2':3, 'x3':4}

a3 = {
    key: a1.get(key, 0) + a2.get(key, 0)
    for key in set(a1.keys() + a2.keys())
}

答案 1 :(得分:2)

我认为a1, a2是字典(即a1 = {x1:1,x2:2,x3:3}而不是方括号)。

假设他们有共同的密钥,你可以通过字典理解来实现

{key: a1[key]+a2[key] for key in a1}

答案 2 :(得分:0)

你可以试试这个:

a1 = [{'x1': 1, 'x2': 2, 'x3': 3}]
a2 = [{'x1': 2, 'x2': 3, 'x3': 4}]
final_list = [{a:a1[0][a]+b for a, b in a2[0].items()}]

输出:

[{'x2': 5, 'x3': 7, 'x1': 3}]

答案 3 :(得分:0)

您可以找到添加到Python 2.7的collections.Counter recepie。 这可以导入Python 2.5+,因此您可以使用它。

然后它很简单:

a1 = {1:1,2:2,3:3}
a2 = {1:2,2:3,3:4}
from collections import Counter
c1 = Counter(a1)
c2 = Counter(a2)
c1.update(c2)
c1
Counter({3: 7, 2: 5, 1: 3})

答案 4 :(得分:0)

您编写的代码(和描述)在Python中没有意义。你正在混合列表和词典!

如果您使用大括号[]替换示例中的方括号{},那么您将使用词典。

列表没有密钥。字典。

以下是如何以您希望的方式组合两个词典

# Alternative way of making two dicts
a = dict(a=1,b=2,d=3)
b = dict(a=4,b=5,c=6)

# make a set of all the keys
keys = set.union(set(a), set(b))

# Create a new dictionary combining the data in the first two
ab = { k : a.get(k,0) + b.get(k,0) for k in keys}

print(ab)

此代码的输出是

{'c': 6, 'd': 3, 'a': 5, 'b': 7}

此代码不假设两个词典具有相同的键集,因此我们首先创建一组可在词典中找到的所有键。

然后我们使用一个名为字典理解的构造,这只是一种从你在别处存储的数据构建字典的简写语法。

在dict理解中,我们遍历我们之前找到的所有键,并在原始dicts中查找相应的值并将它们加在一起,然后将它们存储在相同键下的新dict中。

我们必须使用d.get(key, 0)而不是d[key],因为后者会为第一个密钥引发KeyError异常,该异常只存在于其中一个原始代码中。 get的第二个参数是在密钥不存在时应该返回的值。