2014-01-19 164 views

回答

10

可以使用減少:

reduce(lambda r, d: r.update(d) or r, lst, {}) 

演示:

>>> lst = [ 
...  {'1': 'A'}, 
...  {'2': 'B'}, 
...  {'3': 'C'} 
... ] 
>>> reduce(lambda r, d: r.update(d) or r, lst, {}) 
{'1': 'A', '3': 'C', '2': 'B'} 

,或者你可以鏈的項目要求(Python的2):

from itertools import chain, imap 
from operator import methodcaller 

dict(chain.from_iterable(imap(methodcaller('iteritems'), lst))) 

的Python 3版本:

from itertools import chain 
from operator import methodcaller 

dict(chain.from_iterable(map(methodcaller('items'), lst))) 

演示:

>>> from itertools import chain, imap 
>>> from operator import methodcaller 
>>> 
>>> dict(chain.from_iterable(map(methodcaller('iteritems'), lst))) 
{'1': 'A', '3': 'C', '2': 'B'} 

或者使用字典理解:

{k: v for d in lst for k, v in d.iteritems()} 

演示:

>>> {k: v for d in lst for k, v in d.iteritems()} 
{'1': 'A', '3': 'C', '2': 'B'} 

三,爲簡單的3字典輸入,該字典的理解是最快:

>>> import timeit 
>>> def d_reduce(lst): 
...  reduce(lambda r, d: r.update(d) or r, lst, {}) 
... 
>>> def d_chain(lst): 
...  dict(chain.from_iterable(imap(methodcaller('iteritems'), lst))) 
... 
>>> def d_comp(lst): 
...  {k: v for d in lst for k, v in d.iteritems()} 
... 
>>> timeit.timeit('f(lst)', 'from __main__ import lst, d_reduce as f') 
2.4552760124206543 
>>> timeit.timeit('f(lst)', 'from __main__ import lst, d_chain as f') 
3.9764280319213867 
>>> timeit.timeit('f(lst)', 'from __main__ import lst, d_comp as f') 
1.8335261344909668 

當你增加項目在inputlist到1000的數字,然後將chain方法趕上:

>>> import string, random 
>>> lst = [{random.choice(string.printable): random.randrange(100)} for _ in range(1000)] 
>>> timeit.timeit('f(lst)', 'from __main__ import lst, d_reduce as f', number=10000) 
5.420135974884033 
>>> timeit.timeit('f(lst)', 'from __main__ import lst, d_chain as f', number=10000) 
3.464245080947876 
>>> timeit.timeit('f(lst)', 'from __main__ import lst, d_comp as f', number=10000) 
3.877490997314453 

進一步增加輸入列表中沒有出現偏離這裏上了; chain()的方法比較快,但從未獲得明顯的優勢。

+0

該死!你擊敗了我,而我發佈演示:) – inspectorG4dget

+0

你有這一切想法? :O:P –

1
answer = {} 
for d in L: 
    answer.update(d) 

輸出

>>> L = [ 
...  {'1': 'A'}, 
...  {'2': 'B'}, 
...  {'3': 'C'} 
... ] 
>>> answer = {} 
>>> for d in L: answer.update(d) 
... 
>>> answer 
{'2': 'B', '3': 'C', '1': 'A'} 

OR

answer = {k:v for d in L for k,v in d.items()} 
6

您可以使用dictionary comprehension

>>> lst = [ 
...  {'1': 'A'}, 
...  {'2': 'B'}, 
...  {'3': 'C'} 
... ] 
>>> {k:v for x in lst for k,v in x.items()} 
{'2': 'B', '3': 'C', '1': 'A'} 
>>> 
+1

我認爲這是最簡單,最簡單的。 – tayfun

+0

此解決方案適用於python3,對於python2,您應該使用x.iteritems() –