【问题标题】:How to merge two nested dictionaries in python, which have same keys and have array type values?如何在python中合并两个嵌套字典,它们具有相同的键并且具有数组类型值?
【发布时间】:2021-09-05 07:14:34
【问题描述】:

我需要合并两个字典 d1 和 d2,其中:

d1 = {0: [array([ 42.9017, -78.6631]), array([ 41.5372, -74.0526]), array([ 39.8017, -89.6437])], 
  1: [array([ 34.7269, -86.5673]), array([ 29.7229, -98.0742])],
  2: [array([  35.9878, -115.1167]), array([  34.0316, -117.6187])],array([  61.6303, -148.9872])]}

d2 = {0: [array([5, 5], dtype=int64), array([44, 44], dtype=int64),array([1, 1], dtype=int64)], 
  1: [array([1, 1], dtype=int64), array([12, 12], dtype=int64), array([1, 1], dtype=int64)],
  2: [array([1, 1], dtype=int64), array([12, 12], dtype=int64), array([1, 1], dtype=int64)]}

在合并 d1 和 d2 后我需要字典 d3,这样,d1 的 key:0 的第一个值与 d2 的 key:0 的第一个值合并。

期望 d3 为:

  d3 =  {0: [array([ 42.9017, -78.6631]), array([5, 5], dtype=int64), array([ 41.5372, -74.0526]), array([44, 44], dtype=int64) , array([ 39.8017, -89.6437]), array([1, 1], dtype=int64)], 
  1: [array([ 34.7269, -86.5673]), array([1, 1], dtype=int64), array([ 29.7229, -98.0742]), array([12, 12], dtype=int64)],
  2: [array([  35.9878, -115.1167]),array([1, 1], dtype=int64),array([1, 1], dtype=int64), array([12, 12], dtype=int64), array([  34.0316, -117.6187])],array([1, 1], dtype=int64), array([ 61.6303, -148.9872])]}

我尝试了多种方法,但似乎没有一种方法能正常工作。 任何帮助深表感谢!谢谢!

【问题讨论】:

  • 请发布您尝试过的内容;有人可能会帮助您解决问题。
  • 您能说明一下您对 d3 的期望吗?你的例子足够短,应该相对容易。
  • @ScottHunter 我试过这个代码: from copy import deepcopy Dict1 = d1 Dict2 = d2 dic = deepcopy(dict1) print(dict1) for key in dict2.keys(): if key in dic: dic [key].update(dict2[key]) else: dic[key] = dict2[key] 输出:这段代码没有在索引级别合并值,这是理想的预期
  • @AnneAunyme 我希望 d3 也是一本字典……是的,这只是 d1 和 d2 的子集……我在每个字典中总共有 765 个值
  • @Sparsh_ag 你能写出来吗?像你期望的那样写 d3?

标签: python arrays dictionary nested


【解决方案1】:

我希望我已经很好地理解了您的问题。您可以使用itertools.zip_longest 在两个字典中的值之间交替

from itertools import zip_longest

out = {}
for k in d1.keys() | d2.keys():
    for v1, v2 in zip_longest(d1.get(k, []), d2.get(k, [])):
        out.setdefault(k, [])
        if not v1 is None:
            out[k].append(v1)
        if not v2 is None:
            out[k].append(v2)

print(out)

打印:

{
    0: [
        array([42.9017, -78.6631]),
        array([5, 5]),
        array([41.5372, -74.0526]),
        array([44, 44]),
        array([39.8017, -89.6437]),
        array([1, 1]),
    ],
    1: [
        array([34.7269, -86.5673]),
        array([1, 1]),
        array([29.7229, -98.0742]),
        array([12, 12]),
        array([1, 1]),
    ],
    2: [
        array([35.9878, -115.1167]),
        array([1, 1]),
        array([34.0316, -117.6187]),
        array([12, 12]),
        array([61.6303, -148.9872]),
        array([1, 1]),
    ],
}

【讨论】:

    【解决方案2】:

    如果您确定两个dicts 具有相同的键,并且您不关心d1d2 值中的元素在它们对应的d3 值中出现的顺序,那么它是很简单

    d3 = {k: d1[k]+d2[k] for k in d1}
    

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2017-04-20
      • 2018-08-02
      • 1970-01-01
      相关资源
      最近更新 更多