我有一個單鍵詞典列表。例如:Python - 將單個鍵詞典的列表轉換爲單個詞典
lst = [
{'1': 'A'},
{'2': 'B'},
{'3': 'C'}
]
我想簡單地轉換成普通字典此:
dictionary = {
'1': 'A',
'2': 'B',
'3': 'C'
}
什麼是最簡潔/有效的方式做到這一點?
我有一個單鍵詞典列表。例如:Python - 將單個鍵詞典的列表轉換爲單個詞典
lst = [
{'1': 'A'},
{'2': 'B'},
{'3': 'C'}
]
我想簡單地轉換成普通字典此:
dictionary = {
'1': 'A',
'2': 'B',
'3': 'C'
}
什麼是最簡潔/有效的方式做到這一點?
可以使用減少:
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()
的方法比較快,但從未獲得明顯的優勢。
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()}
您可以使用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'}
>>>
我認爲這是最簡單,最簡單的。 – tayfun
此解決方案適用於python3,對於python2,您應該使用x.iteritems() –
該死!你擊敗了我,而我發佈演示:) – inspectorG4dget
你有這一切想法? :O:P –