215
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Làm thế nào tôi có thể biến một danh sách các dicts như
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
6, thành một dict duy nhất như # Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
7?Câu trả lời ở đây sẽ ghi đè lên các khóa phù hợp giữa hai trong số các dicts đầu vào, bởi vì một dict không thể có các khóa trùng lặp. Nếu bạn muốn thu thập nhiều giá trị từ các khóa phù hợp, hãy xem làm thế nào để hợp nhất các dicts, thu thập các giá trị từ các khóa phù hợp ?.
Hỏi ngày 16 tháng 8 năm 2010 lúc 15:55Aug 16, 2010 at 15:55
5
Điều này hoạt động cho từ điển có độ dài bất kỳ:
>>> result = {}
>>> for d in L:
... result.update[d]
...
>>> result
{'a':1,'c':1,'b':2,'d':2}
Như một sự hiểu biết:
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
wim
313K95 Huy hiệu vàng570 Huy hiệu bạc709 Huy hiệu đồng95 gold badges570 silver badges709 bronze badges
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 16:56Aug 16, 2010 at 16:56
0
Trong trường hợp Python 3.3+, có một bộ sưu tập
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
8:>>> 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:
- Mục đích của bộ sưu tập.chainmap là gì?
Đã trả lời ngày 13 tháng 1 năm 2016 lúc 5:50Jan 13, 2016 at 5:50
Alecxealecxealecxe
449K114 Huy hiệu vàng1043 Huy hiệu bạc1167 Huy hiệu đồng114 gold badges1043 silver badges1167 bronze badges
1
Một chút cải thiện cho @DietBuddha Trả lời với từ điển giải nén từ PEP 448, đối với tôi, nó cũng dễ đọc hơn theo cách này, 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+.
Đã trả lời ngày 9 tháng 2 năm 2020 lúc 17:09Feb 9, 2020 at 17:09
1
Đ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[]}
Chẳng hạn, thay thế K/V ELEM 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 K, V Tuple từ Dictionary .Items [] Trình tạo sau khi rút đối tượng Dict ra khỏi danh sách
Đã trả lời ngày 4 tháng 5 năm 2018 lúc 16:29May 4, 2018 at 16:29
SchaltonschaltonSchalton
2.5732 Huy hiệu vàng30 Huy hiệu bạc41 Huy hiệu Đồng2 gold badges30 silver badges41 bronze badges
Đối với từ điển phẳng, bạn có thể làm điều này:
from functools import reduce
reduce[lambda a, b: dict[a, **b], list_of_dicts]
Siha
7.17212 Huy hiệu vàng32 Huy hiệu bạc42 Huy hiệu đồng12 gold badges32 silver badges42 bronze badges
Đã trả lời ngày 16 tháng 4 năm 2013 lúc 22:36Apr 16, 2013 at 22:36
Dietbuddhadietbuddhadietbuddha
8.26829 Huy hiệu bạc33 Huy hiệu đồng29 silver badges33 bronze badges
>>> 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 đầu ra của bạn vì các dicts không được đặt hàng
Nếu các dicts có thể có nhiều hơn một khóa/giá trị
>>> dict[j for i in L for j in i.items[]]
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 16:38Aug 16, 2010 at 16:38
John La Rooyjohn La RooyJohn La Rooy
286K51 Huy hiệu vàng359 Huy hiệu bạc499 Huy hiệu đồng51 gold badges359 silver badges499 bronze badges
3
Bạn có thể sử dụng chức năng tham gia từ Thư viện Funcy:
from funcy import join
join[list_of_dicts]
Đã trả lời ngày 4 tháng 6 năm 2014 lúc 21:05Jun 4, 2014 at 21:05
SuasuorSuor
2.6721 Huy hiệu vàng20 Huy hiệu bạc28 Huy hiệu đồng1 gold badge20 silver badges28 bronze badges
1
Nếu bạn không cần Singleton dicts nữa:
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
0Đã trả lời ngày 2 tháng 10 năm 2021 lúc 12:41Oct 2, 2021 at 12:41
Không có bình luận nàono comment
6.1854 Huy hiệu vàng10 Huy hiệu bạc 30 Huy hiệu Đồng4 gold badges10 silver badges30 bronze badges
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
1Điều này là không đối xứng bởi vì bạn cần chọn những việc cần làm với các phím trùng lặp; Trong trường hợp này,
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
9 sẽ ghi đè lên >>> from collections import ChainMap
>>> a = [{'a':1},{'b':2},{'c':1},{'d':2}]
>>> dict[ChainMap[*a]]
{'b': 2, 'c': 1, 'a': 1, 'd': 2}
0. Trao đổi chúng theo cách khác.Chỉnh sửa: Ah, xin lỗi, không thấy điều đó.
Có thể làm điều này trong một biểu thức duy nhất:
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
2Khô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 nó có thể là Pythonic [rõ ràng> ẩn, phẳng> lồng nhau] để làm điều này với một vòng lặ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}
1 đơn giản. Ymmv.Đã trả lời ngày 16 tháng 8 năm 2010 lúc 15:58Aug 16, 2010 at 15:58
KatrielkatrielKatriel
117K19 Huy hiệu vàng133 Huy hiệu bạc165 Huy hiệu Đồng19 gold badges133 silver badges165 bronze badges
1
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
3Lưu ý Tôi đã thêm một cặp khóa/giá trị thứ hai vào từ điển cuối cùng để hiển thị nó hoạt động với nhiều mục. Ngoài ra, các khóa từ dicts sau này trong danh sách sẽ ghi đè cùng một khóa từ một dict trước đó.
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 16:59Aug 16, 2010 at 16:59
Dave Kirbydave KirbyDave Kirby
25K5 Huy hiệu vàng64 Huy hiệu bạc82 Huy hiệu Đồng5 gold badges64 silver badges82 bronze badges
Cách này làm việc cho tôi:
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
4Đối tượng in:
# Python >= 2.7
{k: v for d in L for k, v in d.items[]}
# Python < 2.7
dict[pair for d in L for pair in d.items[]]
5Cảm ơn Axes
Đã trả lời ngày 26 tháng 9 lúc 13:14Sep 26 at 13:14