根据python中的键值组合字典

时间:2017-10-27 13:15:11

标签: python dictionary

让我们假设,我在python中有一个键值对,如下所示。

a = {'44': [0, 0, 1, 0, 1], '43': [0, 0, 1, 0, 0]}

现在我想将这些值与:

组合在一起
b = {'44': ['test1'], '43': ['test2']}

如何在python中执行以下输出?

c = {'44': [0, 0, 1, 0, 1, 'test1], '43': [0, 0, 1, 0, 0,'test2']}

7 个答案:

答案 0 :(得分:1)

您可以使用这样的字典理解(从Python 2.7 +开始):

c = {k: a[k] + b[k] for k in a}

这假设ab中存在相同的密钥。 如果情况并非如此,那么必要时可以解决这个问题。

答案 1 :(得分:1)

其他答案基于所有涉及的词典都具有相同键的假设。如果您不确定是这种情况,我建议您使用collections.defaultdict

from collections import defaultdict

result = defaultdict(list)

for d in (a,b):
    for key, value in d.items():
        result[key].append(value)

此外,此解决方案适用于任意数量的词典。只需将要合并的所有词典添加到元组(a,b)

答案 2 :(得分:0)

a = {'44': [0, 0, 1, 0, 1], '43': [0, 0, 1, 0, 0]}
b = {'44': ['test1'], '43': ['test2']}

c = {}

for v in a:
    c[v] = a[v]+b[v]

输出:

{'44': [0, 0, 1, 0, 1, 'test1'], '43': [0, 0, 1, 0, 0, 'test2']}

答案 3 :(得分:0)

您可以将zip()与字典理解结合使用,以实现如下所示的单行代码:

c = {k: v for k, v in zip(a.keys(), (v1 + v2 for v1, v2 in zip(a.values(), b.values())))}

<强>输出:

>>> c
{'44': [0, 0, 1, 0, 1, 'test1'], '43': [0, 0, 1, 0, 0, 'test2']}

答案 4 :(得分:0)

首先想到的是:

var sum = $('.list .cart-items', this)
  .find('.bay-qty')
  .map(function () { return this.data("id"); })
  .get() // get the array
  .reduce(function (sum, value) { return sum + value; }, 0)

即使一个字典中缺少某些键,这也应该有效。我认为这只适用于较新版本的python 3。

答案 5 :(得分:0)

我假设ab包含相同的键。然后你可以简单地使用dict理解(Create a dictionary with list comprehension in Python):

c = {x: a[x] + b[x] for x in a}

如果你不知道b是否有相同的密钥,你也可以测试一下:

c = {x: a[x] + b[x] for x in a if x in b}

答案 6 :(得分:0)

你可以试试这个:

a = {'44': [0, 0, 1, 0, 1], '43': [0, 0, 1, 0, 0]}
b = {'44': ['test1'], '43': ['test2']}
final_data = {c:a[c]+b[c] for c, d in a.items()}

输出:

{'44': [0, 0, 1, 0, 1, 'test1'], '43': [0, 0, 1, 0, 0, 'test2']}

如果你需要生成&#34; test1&#34;,&#34; test2&#34;值等,你可以试试这个:

l1 = {}
for c, d in a.items():
   if d not in l1.values(): 
       l1["test{}".format(len(l1)+1)] = d

print(l1)

输出:

{'test1': [0, 0, 1, 0, 1], 'test2': [0, 0, 1, 0, 0]}