2012-07-18 138 views
3

我想加入字典中的關鍵'用戶'是相同的列表,但我不知道如何。例如:Python字典列表合併

[{'count2': 34, 'user': 2}, 
{'count4': 233, 'user': 2}, 
{'count2': 234, 'user': 4}, 
{'count4': 344, 'user': 5}] 

將成爲:

[{'count2': 34, 'count4': 233, 'user': 2 }, 
{'count2': 234, 'user': 4}, 
{'count4': 344, 'user': 5}] 

我廣泛搜查沒有發現堆棧溢出類似的東西,任何幫助,將不勝感激。

+1

會按字典索引的字典工作嗎?也就是說,'{2:{'count2':34 ...},4:{'count2':234 ...}'等等?它更直觀,可能會更容易構建 – 2012-07-18 16:08:44

回答

1

這樣的事情應該工作。但有可能是更有效的方法來做到這一點(並在更少的行)...

# Input 
a=[{'count2': 34, 'user': 2}, 
{'count4': 233, 'user': 2}, 
{'count2': 234, 'user': 4}, 
{'count4': 344, 'user': 5}] 

# Get set of unique users 
u=list(set([x['user'] for x in a])) 

# Create a blank list of dictionaries for the result 
r=[{}] * len(u) 

# Iterate over input and add the dictionaries together 
for x in a: 
    r[u.index(x['user'])] = dict(r[u.index(x['user'])].items() + x.items()) 


>>> r 
[{'count2': 34, 'user': 2, 'count4': 233}, {'count2': 234, 'user': 4}, {'count4': 344, 'user': 5}] 
+1

輸入不應該被稱爲'a'而不是'i'嗎? – mgilson 2012-07-18 16:27:57

+1

@mgilson:是的,謝謝。我修復了它。我有點糊塗,從我的測試終端 – 2012-07-18 16:29:59

+0

複製/粘貼如果我想讓列表中的結果字典具有與零相同的密鑰作爲默認值,該怎麼辦?在此先感謝 – Arkantos 2012-07-19 15:22:50

1

在陣列:

[{'count2': 34, 'user': 2}, 
{'count4': 233, 'user': 2}, 
{'count2': 234, 'user': 4}, 
{'count4': 344, 'user': 5}] 

使得a = {'count2': 34, 'user': 2}b = {'count4': 233, 'user': 2}

dict(a.items() + b.items()) 

將返回:

{'count2': 34, 'count4': 233, 'user': 2 } 

編輯:工作羣體:

http://codepad.org/ObWT2Hl3

+2

只合並其中兩個,而不是組合。 – 2012-07-18 16:07:19

+1

我的意思是它需要明確說明應該將哪些組加在一起;如果需要合併數百個字典,它就會失效。不過,這是解決方案的一部分。 – 2012-07-18 16:10:04

3

排序,然後你可以使用GROUPBY,然後把它合併

from itertools import groupby 
def merge(dicts): 
    ret = {} 
    for d in dicts: 
     ret.update(d) 
    return ret 

d = [...] 
sorted_d = sorted(d, key=lambda x: x['user']) 
grouped_d = itertools.groupby(sorted_d, key=lambda x: x['user']) 
print [merge(y[1]) for y in grouped] 
7
from collections import defaultdict 

dl = [{'count2': 34, 'user': 2}, 
{'count4': 233, 'user': 2}, 
{'count2': 234, 'user': 4}, 
{'count4': 344, 'user': 5}] 
print dl 

dd = defaultdict(dict) 
for d in dl: 
    dd[d['user']].update(d) 
print dd.values() 
+3

你可以用'dd [u] .update(d)'替換d中的k,v代替d.items():dd [u] [k] = v'。 – 2012-07-18 16:28:29

+0

@LieRyan:對,完成; +1 – dugres 2012-07-18 16:33:16