2017-08-12 60 views
3

我有字典的格式如下列表的列表:结合相同的键的值类型的字典

foo = [ 
    {'a': 'x', 'b': 'y', 'c': 'z'}, 
    {'a': 'j', 'c': 'z'} 
] 

我想组字典这个名单成一个单一的字典,如:

bar = { 
    'a': ['x', 'j'], 
    'b': ['y', None], 
    'c': ['z', 'z'] 
} 

我目前所做的是循环遍历foo中的所有字典并创建一个键列表,然后再次循环创建bar。我想知道是否有更简单的方法来实现这一点。谁能帮忙?

+0

确实'foo'只有2个字母或只是任何数字? –

+0

@ Jean-FrançoisFabre它可以有两个以上。 – akhilsp

回答

4
bar = { 
    k: [d.get(k) for d in foo] 
    for k in set().union(*foo) 
} 

观光谷歌:

  • Python列表理解
  • 蟒蛇字典理解
  • 蟒蛇星级
  • 蟒蛇字典得到
  • 蟒蛇并集
+2

很好的解决方案,可能会有一些解释。我喜欢'set()。union(* foo)'部分。 –

+1

@ Jean-FrançoisFabre这是怎么回事? –

+0

我更喜欢明确的,但你得到我的投票,因为_I_找到有用的解释与否。 –

2

我会做这两个步骤:

  1. 收集所有按键成一个单一的迭代:

    >>> import operator 
    >>> from functools import reduce 
    >>> all_keys = reduce(operator.or_, (d.keys() for d in foo)) 
    >>> all_keys 
    {'a', 'b', 'c'} 
    
  2. 使用字典理解产生期望的结果:

    >>> bar = {key: [d.get(key) for d in foo] for key in all_keys} 
    >>> bar 
    {'a': ['x', 'j'], 'b': ['y', None], 'c': ['z', 'z']} 
    
+0

不错的。我可以建议'all_keys = reduce(operator.or_,map(dict.keys,foo))'? –

+0

这对我来说很好。谢谢 – akhilsp

+1

这只是Python 3。 –