Python 3.x:合并两个具有相同键和值的字典

时间:2019-01-04 14:28:03

标签: python python-3.x dictionary

Python版本:3.x

我有两个具有相同键的字典,其值是数组。出于必要的目的,我在这里看到的大多数问题的每个键都只有一个值。我想要的是将这两个字典与值合并为连接数组。也许下面会清除:

我所拥有的:

d1 = {(1, "Autumn"): np.array([2.5, 4.5, 7.5, 9.5]), (1, "Spring"): np.array([10.5, 11.7, 12.3, 15.0])}
d2 = {(1, "Autumn"): np.array([10.2, 13.3, 15.7, 18.8]), (1, "Spring"): np.array([15.6, 20, 23, 27])}

我尝试过:

d3 = {**d1, **d2}

我想要什么:

d3 = {(1, "Autumn"): np.array([2.5, 4.5, 7.5, 9.5, 10.2, 13.3, 15.7, 18.8]), (1, "Spring"): np.array([10.5, 11.7, 12.3, 15.0, 15.6, 20, 23, 27])}

我在这里错过了什么吗?请帮忙!

P.S:我看过How to merge two dictionaries in a single expression?

4 个答案:

答案 0 :(得分:4)

如果两个字典中的键始终相同,那么这应该适合您的需求:

d3 = {key:np.hstack([d1[key],d2[key]]) for key in d1.keys()}

输出:

In [7]: d3
Out[7]: 
{(1, 'Autumn'): array([ 2.5,  4.5,  7.5,  9.5, 10.2, 13.3, 15.7, 18.8]),
 (1, 'Spring'): array([10.5, 11.7, 12.3, 15. , 15.6, 20. , 23. , 27. ])}

但这取决于以下假设:每个键都有一个值,并且每个键都出现在两个字典中。

答案 1 :(得分:2)

我相信您需要像这样的东西:

{key:np.append(d1[key], d2[key]) for key in d1.keys()}

虽然不确定np.append。 而且,当然,只有在字典具有相同键的情况下,它才会起作用。

答案 2 :(得分:2)

尝试一下:

>>> import numpy as np
>>> d1 = {(1, "Autumn"): np.array([2.5, 4.5, 7.5, 9.5]), (1, "Spring"): np.array([10.5, 11.7, 12.3, 15.0])}
>>> d2 = {(1, "Autumn"): np.array([10.2, 13.3, 15.7, 18.8]), (1, "Spring"): np.array([15.6, 20, 23, 27])}
>>> d3 = {k: np.concatenate((d1.get(k, np.array([])), d2.get(k, np.array([])))) for k in set(d1.keys()).union(set(d2.keys()))}
>>> d3
{(1, 'Spring'): array([10.5, 11.7, 12.3, 15. , 15.6, 20. , 23. , 27. ]), (1, 'Autumn'): array([ 2.5,  4.5,  7.5,  9.5, 10.2, 13.3, 15.7, 18.8])}

注释

  • 这是 dict 理解
  • 首先,计算2个 dict 中键的并集,以确保不留键(为此,每个 dict 中的键转换为 set
  • 对于上述集合中的每个元素,请从每个 dict 中获取相应的数组(如果不存在键,则为空),并将它们连接起来
  • 这是 Python ic(也是 general )方法,我的 numpy 知识接近 0 (我敢肯定,从代码片段中可以很明显地看出来-加上所有括号,它看起来非常复杂), numpy 很有可能在其中更加优雅的方式
  • [SO]: How to merge two dictionaries in a single expression?所需的输出和当前的输出(考虑到 dict 的值只是可迭代的(无论它们是 Python 还是 numpy 或其他无关紧要的))是 dict 的 merge 概念的2种不同(且同样正确)的方法,公用密钥:
    • 一个只保留最后一个 dict
    • 中的值
    • 其他所有和(无论 sum 对操作数意味着什么)

答案 3 :(得分:1)

import numpy as np

d1 = {(1, "Autumn"): [2.5, 4.5, 7.5, 9.5], (1, "Spring"): [10.5, 11.7, 12.3, 15.0]}
d2 = {(1, "Autumn"): [10.2, 13.3, 15.7, 18.8], (1, "Spring"): [15.6, 20, 23, 27]}
d3 = {(1, "Autumn"): np.array(d1[(1, "Autumn")] + d2[(1, "Autumn")]), (1,"Spring"): np.array(d1[(1, "Spring")] + d2[(1, "Spring")])}

我最后使用了np.array(),因为列表和numpy数组之间存在差异。当您在numpy中使用A + B时,A的每个元素都添加到B的另一个元素数组中。另一方面,当使用A+B时,A和B是列表,它们彼此连接