Làm thế nào tôi có thể lật một danh sách các phái như thế này
[{'a':1}, {'b':2}, {'c':1}, {'d':2}]
Thành một mệnh đề duy nhất như thế này
{'a':1, 'b':2, 'c':1, 'd':2}
Làm thế nào tôi có thể lật một danh sách các phái như thế này
[{'a':1}, {'b':2}, {'c':1}, {'d':2}]
Thành một mệnh đề duy nhất như thế này
{'a':1, 'b':2, 'c':1, 'd':2}
Câu trả lời:
Trong trường hợp Python 3.3+, có một ChainMapbộ sưu tập :
>>> from collections import ChainMap
>>> a = [{'a':1},{'b':2},{'c':1},{'d':2}]
>>> dict(ChainMap(*a))
{'b': 2, 'c': 1, 'a': 1, 'd': 2}
Cũng thấy:
>>> L=[{'a': 1}, {'b': 2}, {'c': 1}, {'d': 2}]
>>> dict(i.items()[0] for i in L)
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
Lưu ý: thứ tự của 'b' và 'c' không khớp với kết quả đầu ra của bạn vì các số không có thứ tự
nếu các phần có thể có nhiều hơn một khóa / giá trị
>>> dict(j for i in L for j in i.items())
Điều này tương tự như @delnan nhưng cung cấp tùy chọn để sửa đổi các mục k / v (khóa / giá trị) và tôi tin rằng dễ đọc hơn:
new_dict = {k:v for list_item in list_of_dicts for (k,v) in list_item.items()}
ví dụ: thay thế k / v elems như sau:
new_dict = {str(k).replace(" ","_"):v for list_item in list_of_dicts for (k,v) in list_item.items()}
giải nén bộ tuple k, v từ trình tạo .items () từ điển sau khi kéo đối tượng dict ra khỏi danh sách
dict1.update( dict2 )
Điều này là không đối xứng vì bạn cần phải chọn làm gì với các khóa trùng lặp; trong trường hợp này, dict2sẽ ghi đè dict1. Đổi chúng theo cách khác.
CHỈNH SỬA: À, xin lỗi, không thấy.
Có thể thực hiện điều này trong một biểu thức duy nhất:
>>> from itertools import chain
>>> dict( chain( *map( dict.items, theDicts ) ) )
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
Không có tín dụng cho tôi cho điều này cuối cùng!
Tuy nhiên, tôi cho rằng có thể có nhiều Pythonic hơn (rõ ràng> ngầm định, phẳng> lồng nhau) để làm điều này với một forvòng lặp đơn giản . YMMV.
Cải tiến nhỏ cho câu trả lời @dietbuddha với việc giải nén từ điển từ PEP 448 , đối với tôi, nó dễ đọc hơn theo cách này, đồng thời, nó cũng nhanh hơn :
from functools import reduce
result_dict = reduce(lambda a, b: {**a, **b}, list_of_dicts)
Nhưng hãy nhớ rằng điều này chỉ hoạt động với các phiên bản Python 3.5+.
>>> dictlist = [{'a':1},{'b':2},{'c':1},{'d':2, 'e':3}]
>>> dict(kv for d in dictlist for kv in d.iteritems())
{'a': 1, 'c': 1, 'b': 2, 'e': 3, 'd': 2}
>>>
Lưu ý rằng tôi đã thêm cặp khóa / giá trị thứ hai vào từ điển cuối cùng để cho thấy nó hoạt động với nhiều mục nhập. Ngoài ra, các khóa từ các phái sau trong danh sách sẽ ghi đè lên cùng một khóa từ một chính tả trước đó.
dic1 = {'Maria': 12, 'Paco': 22, 'Jose': 23} dic2 = {'Patricia': 25, 'Marcos': 22 'Tomas': 36}
dic2 = dict (dic1.items () + dic2.items ())
và đây sẽ là kết quả:
dic2 {'Jose': 23, 'Marcos': 22, 'Patricia': 25, 'Tomas': 36, 'Paco': 22, 'Maria': 12}