2017-08-12 86 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。 –

相關問題