【问题标题】:Merging dictionaries from a list of dictionaries in python [duplicate]从python中的字典列表中合并字典[重复]
【发布时间】:2013-04-20 15:42:04
【问题描述】:

我创建了一个字典列表,其中每个字典都有一个列表形式的值,如下所示:

dictlist=[{a:['e','f','g'],b:['h','i','k'],c:['u','v',w]},{a:['t','u']}]

上面的例子在列表中包含两个字典:

one is {a:['e','f','g'],b:['h','i','k'],c:['u','v',w]} 
and another dictionary is {a:['t','u']}

我想要的只是组合这个列表的元素,以便生成一个完整的字典,列表中具有相同的键和值,如下所示:

finaldictionary = {a:['e','f','g','t','u'],b:['h','i',k],c:['u','v','w']}

【问题讨论】:

标签: python list merge dictionary


【解决方案1】:

你可以在这里使用collections.defaultdict

>>> from collections import defaultdict

>>> dic=defaultdict(list)

>>> dictlist=[{'a':['e','f','g'],'b':['h','i','k'],'c':['u','v','w']},{'a':['t','u']}]

>>> for x in dictlist:
    for k,v in x.items():
        dic[k].extend(v)

>>> dic
defaultdict(<type 'list'>, {'a': ['e', 'f', 'g', 't', 'u'], 'c': ['u', 'v', 'w'], 'b': ['h', 'i', 'k']})

或使用dict.setdefault:

>>> dic={}

>>> for x in dictlist:
        for k,v in x.items():
            dic.setdefault(k,[]).extend(v)

>>> dic
{'a': ['e', 'f', 'g', 't', 'u'], 'b': ['h', 'i', 'k'], 'c': ['u', 'v', 'w']}

【讨论】:

  • 这个问题是输出字典上的关键缺失会错误地返回空列表。
  • @Aya 我的第二个解决方案将在这种情况下工作。
  • 是的,但是在我发表评论之后进行了编辑。 ;-)
  • 很好的答案,但我想知道这些In [16] 来自哪里以及它们应该如何对任何人有所帮助。
  • @thg435 我已经用普通解释器使用的传统&gt;&gt;&gt; 替换了那些In[],Out[]。如果您仍然想知道,请查看IPython解释器。
【解决方案2】:

“老派”解决方案是这样的......

finaldict = {}
dictlist = [{'a': ['e','f','g'], 'b': ['h','i','k'], 'c': ['u','v','w']},
            {'a': ['t','u']}]
for d in dictlist:
    for k in d.keys():
        try:
            finaldict[k] += d[k]
        except KeyError:
            finaldict[k] = d[k]

...这可能适用于自 v1.0 以来的所有 Python 版本,但有许多更新的方法可以做到这一点。

【讨论】:

  • 我们的解决方案都需要支持 Python 1.0! :P
  • @jamylak 这主要是因为我 15 年前开始使用 Python。此外,如果 OP 没有指定他使用的版本,对我来说,这比处理“这给了我ImportError: no module named collections”之类的后续评论更容易:P
  • 作为老派 python 用户的道具,但我认为我们可以有把握地假设每个人都使用 2.7+,也许 1% 的 OP 使用 2.6,但没有比这更低
  • 只是想知道,你知道dict.get是什么时候出现的吗? (哪个python版本)。它从2.0 开始就一直存在......我想你可以使用它,但它可能与1.0 不兼容
  • @jamylak 当然。另一点是其他答案的前半部分已经发布,我已经评论过这不太正确,我发布相同的答案没有意义。至于dict.get,我依稀记得在v1.5中使用过,但我不确定。编辑:它在 v1.5 docs.
猜你喜欢
  • 2020-03-03
  • 2019-01-05
  • 2018-10-16
  • 2021-11-05
  • 2013-12-01
  • 2013-07-06
  • 2019-01-09
  • 2012-08-11
  • 2012-07-17
相关资源
最近更新 更多