【问题标题】:merging Python dictionaries合并 Python 字典
【发布时间】:2011-01-22 21:10:05
【问题描述】:

我正在尝试合并以下 python 字典,如下所示:

dict1= {'paul':100, 'john':80, 'ted':34, 'herve':10}
dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}

output = {'paul':[100,'a'],
          'john':[80, 'b'],
          'ted':[34,'c'],
          'peter':[None, 'd'],
          'herve':[10, None]}

有没有有效的方法来做到这一点?

【问题讨论】:

  • 我希望保留两个字典中的所有键
  • 请不要将 cmets 添加到您自己的问题中。这是你的问题。您可以更新问题,使其正确。评论是为了让其他人对您的问题发表评论。
  • @rcreswick's answerstackoverflow.com/questions/38987/… question 应该适合您的需求。
  • 在这里稍微格式化一下会大有帮助。尝试编辑您的问题:选择代码并单击编辑窗口中的“101 010”按钮。此外,将 dict1 和 dict2 分成两行。
  • 另见: similar question

标签: python list dictionary data-structures merge


【解决方案1】:
output = {k: [dict1[k], dict2.get(k)] for k in dict1}
output.update({k: [None, dict2[k]] for k in dict2 if k not in dict1})

【讨论】:

  • 您能否详细说明为什么会这样?传递给dict()update() 的对象是什么?是发电机吗?
  • @Heisenberg,它们是生成器表达式(又名“genexp”),相当于“列表推导式”(又名“listcomp”)的生成器——方便使生成器内联的方法(与等效的 listcomp 相比,节省内存的临时使用,如果以后不需要该列表 - 因为它不会在这里,因为 dictupdate 都只需要某种产生 2 项元组的迭代器被视为 (key, value))。
【解决方案2】:

这将起作用:

{k: [dict1.get(k), dict2.get(k)] for k in set(dict1.keys() + dict2.keys())}

输出:

{'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}

【讨论】:

    【解决方案3】:

    Python2.7Python3.1 中,您可以使用列表、集合和字典推导式的组合轻松泛化以使用任意数量的字典!

    >>> dict1 = {'paul':100, 'john':80, 'ted':34, 'herve':10}
    >>> dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}
    >>> dicts = dict1,dict2
    >>> {k:[d.get(k) for d in dicts] for k in {k for d in dicts for k in d}}
    {'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}
    

    Python2.6 没有集合推导或字典推导

    >>> dict1 = {'paul':100, 'john':80, 'ted':34, 'herve':10}
    >>> dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}
    >>> dicts = dict1,dict2
    >>> dict((k,[d.get(k) for d in dicts]) for k in set(k for d in dicts for k in d))
    {'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}
    

    【讨论】:

    • py3k 也有 dict 理解 ;)
    • @SilentGhost,我也是这么想的。想象一下当我看到你的评论时我的惊讶:) 现在在 3.1 中非常简洁
    【解决方案4】:

    在 Python3.1 中,

    output = {k:[dict1.get(k),dict2.get(k)] for k in dict1.keys() | dict2.keys()}<br>
    在 Python2.6 中,
    output = dict((k,[dict1.get(k),dict2.get(k)]) for k in set(dict1.keys() + dict2.keys()))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 2012-07-17
      • 2018-10-16
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多