好吧,採取的靈感來自鏈接的問題,你可以這樣做:
In [12]: from collections import defaultdict
...: from functools import reduce
In [13]: lst = [{'1': 'A'}, {'1': 'B'}, {'2': 'C'}, {'2': 'D'}, {'3': 'E'}]
In [14]: def foo(r, d):
...: for k in d:
...: r[k].append(d[k])
...:
In [16]: d = reduce(lambda r, d: foo(r, d) or r, lst, defaultdict(list))
In [17]: d
Out[17]: defaultdict(list, {'1': ['A', 'B'], '2': ['C', 'D'], '3': ['E']})
你需要一箇中間的功能做更新...我認爲有更好的方式來做到這一點,但這是關鍵所在。
現在,如果你想有一個更清潔,更可讀的方式,你可以這樣做:
In [12]: from collections import defaultdict
In [30]: lst = [{'1': 'A'}, {'1': 'B'}, {'2': 'C'}, {'2': 'D'}, {'3': 'E'}]
In [31]: d = defaultdict(list)
In [32]: for i in lst:
...: k, v = list(i.items())[0] # an alternative to the single-iterating inner loop from the previous solution
...: d[k].append(v)
...:
In [33]: d
Out[33]: defaultdict(list, {'1': ['A', 'B'], '2': ['C', 'D'], '3': ['E']})
爲什麼使用'reduce'?它是否必須使用「減少」? – abccd
請做出一個嘗試,然後如果你卡住了,回來問問。 – wwii
@wwii我真的很想知道爲什麼這個評論是可以的,而試圖評論「你試過什麼?」你會收到來自SO的消息,告訴你不能這樣做。 –