Danh sách các từ điển có thể có cùng một khóa với các giá trị khác nhau hoặc cùng nhau. Sử dụng hàm giảm [] và toán tử + có thể tổng hợp các giá trị có cùng một khóa trong từ điển Python.reduce[] function and + operator can sum values with the same key in Python dictionary.
Bạn có thể có cùng một khóa hai lần trong từ điển Python. Mỗi chìa khóa trong từ điển phải là duy nhất. Đọc tài liệu. [Nếu một khóa xảy ra nhiều lần, giá trị cuối cùng cho khóa đó trở thành giá trị tương ứng trong từ điển mới.]
Mã ví dụ đơn giản.
Đối với ví dụ này, bạn phải nhập mô -đun functools.functools module.
import collections
import functools
import operator
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
# sum the values with same keys
res = dict[functools.reduce[operator.add,
map[collections.Counter, my_dict]]]
print["New dict : ", res]
Output::
Hoặc sử dụng phương pháp truy cập
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
Đầu ra: Diễn ngôn mới: {‘A,: 17,‘ B, 6, ‘C, 12}: New dict : {‘a’: 17, ‘b’: 6, ‘c’: 12}
Hãy bình luận nếu bạn có bất kỳ nghi ngờ hoặc đề xuất nào về mã từ điển tổng python này.
Lưu ý: IDE: & NBSP; Pycharm & NBSP; 2021.3.3 [Phiên bản cộng đồng] IDE: PyCharm 2021.3.3 [Community Edition]
Windows 10
Python 3.10.1
Tất cả & nbsp; ví dụ python & nbsp; là trong & nbsp; Python & nbsp; 3, vì vậy có thể khác với các phiên bản Python 2 hoặc nâng cấp. Python Examples are in Python 3, so Maybe its different from python 2 or upgraded versions.
Bằng cấp về Khoa học máy tính và Kỹ sư: Nhà phát triển ứng dụng và có nhiều ngôn ngữ lập trình kinh nghiệm. Sự nhiệt tình cho công nghệ và thích học kỹ thuật.
Trong Python, tôi có danh sách các dicts:
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
Tôi muốn một dict cuối cùng sẽ chứa tổng của tất cả các dicts. Tức là kết quả sẽ là:
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
2N.B: Mỗi dict trong danh sách sẽ chứa cùng số lượng khóa, các cặp giá trị.
STH
Phim thương hiệu vàng 216K5252 gold badges274 silver badges364 bronze badges
Hỏi ngày 16 tháng 8 năm 2010 lúc 5:12Aug 16, 2010 at 5:12
Nazmul Hasannazmul HasanNazmul Hasan
6.70013 Huy hiệu vàng35 Huy hiệu bạc37 Huy hiệu đồng13 gold badges35 silver badges37 bronze badges
0
Bạn có thể sử dụng bộ sưu tập.
counter = collections.Counter[]
for d in dict1:
counter.update[d]
Hoặc, nếu bạn thích Oneliners:
functools.reduce[operator.add, map[collections.Counter, dict1]]
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 6:38Aug 16, 2010 at 6:38
3
Một chút xấu xí, nhưng là một lớp lót:
dictf = reduce[lambda x, y: dict[[k, v + y[k]] for k, v in x.iteritems[]], dict1]
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 5:23Aug 16, 2010 at 5:23
Carlcarlcarl
48.9K17 Huy hiệu vàng73 Huy hiệu bạc82 Huy hiệu Đồng17 gold badges73 silver badges82 bronze badges
7
Tận dụng
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
3 sẽ có được hiệu suất tốt hơn khi thêm nhiều hơn một vài dicts>>> dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
>>> from operator import itemgetter
>>> {k:sum[map[itemgetter[k], dict1]] for k in dict1[0]} # Python2.7+
{'a': 5, 'b': 7}
>>> dict[[k,sum[map[itemgetter[k], dict1]]] for k in dict1[0]] # Python2.6
{'a': 5, 'b': 7}
Thêm đề xuất của Stephan
>>> {k: sum[d[k] for d in dict1] for k in dict1[0]} # Python2.7+
{'a': 5, 'b': 7}
>>> dict[[k, sum[d[k] for d in dict1]] for k in dict1[0]] # Python2.6
{'a': 5, 'b': 7}
Tôi nghĩ rằng phiên bản mã Python2.7 của Stephan đọc thực sự độc đáo
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 6:19Aug 16, 2010 at 6:19
John La Rooyjohn La RooyJohn La Rooy
Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges
3
Điều này có thể giúp:
def sum_dict[d1, d2]:
for key, value in d1.items[]:
d1[key] = value + d2.get[key, 0]
return d1
>>> dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
>>> reduce[sum_dict, dict1]
{'a': 5, 'b': 7}
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 5:26Aug 16, 2010 at 5:26
Manoj Govindanmanoj GovindanManoj Govindan
70K21 Huy hiệu vàng131 Huy hiệu bạc138 Huy hiệu đồng21 gold badges131 silver badges138 bronze badges
Mã sau đây hiển thị một cách để làm điều đó:
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
final = {}
for k in dict1[0].keys[]: # Init all elements to zero.
final[k] = 0
for d in dict1:
for k in d.keys[]:
final[k] = final[k] + d[k] # Update the element.
print final
Điều này ra:
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
0như bạn muốn.
Hoặc, như được truyền cảm hứng bởi Kriss, tốt hơn nhưng vẫn có thể đọc được:
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
1Tôi thông cho những ngày của Python gốc, có thể đọc được :-]
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 5:26Aug 16, 2010 at 5:26
Manoj Govindanmanoj Govindanpaxdiablo
70K21 Huy hiệu vàng131 Huy hiệu bạc138 Huy hiệu đồng229 gold badges1550 silver badges1921 bronze badges
7
Mã sau đây hiển thị một cách để làm điều đó:
Điều này ra:
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
2như bạn muốn.
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
3Hoặc, như được truyền cảm hứng bởi Kriss, tốt hơn nhưng vẫn có thể đọc được:
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
4Tôi thông cho những ngày của Python gốc, có thể đọc được :-]May 27, 2014 at 0:42
Paxdiablopaxdiablotrudolf
830K229 Huy hiệu vàng1550 Huy hiệu bạc1921 Huy hiệu Đồng14 silver badges11 bronze badges
Tôi đã quan tâm đến hiệu suất của các phương thức được đề xuất, giảm và tổng hợp cho các danh sách lớn. Có lẽ ai đó cũng quan tâm đến điều này. Bạn có thể xem ở đây: //gist.github.com/torstenrudolf/277e98df296f23ff921c
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
5Tôi đã thử nghiệm ba phương pháp cho danh sách từ điển này:
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
0Phương pháp tổng hợp cho thấy hiệu suất tốt nhất, theo sau là giảm và bộ đếm là chậm nhất. Thời gian hiển thị dưới đây là trong vài giây.
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
7Nhưng điều này phụ thuộc vào số lượng các yếu tố trong từ điển. Phương pháp tổng sẽ chậm lại nhanh hơn giảm.
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
8Đã trả lời ngày 27 tháng 5 năm 2014 lúc 0:42May 26, 2021 at 16:40
TrudolftrudolfSiggyF
1.56914 Huy hiệu bạc11 Huy hiệu đồng8 gold badges39 silver badges56 bronze badges
Bạn cũng có thể sử dụng chức năng tổng gấu trúc để tính tổng:
Kết quả này trong:Aug 16, 2010 at 6:41
Nó cũng hoạt động cho các điểm nổi:Dave Kirby
Đưa ra kết quả chính xác:5 gold badges65 silver badges82 bronze badges
0
Đã trả lời ngày 26 tháng 5 năm 2021 lúc 16:40
import collections
my_dict = [{'a': 5, 'b': 1, 'c': 2},
{'a': 2, 'b': 5},
{'a': 10, 'c': 10}]
counter = collections.Counter[]
for d in my_dict:
counter.update[d]
res = dict[counter]
print["New dict : ", res]
9SiggyfsiggyfDec 30, 2015 at 11:05
Phù bằng vàng 21K839 Huy hiệu bạc56 Huy hiệu ĐồngKyan
Trong Python 2.7, bạn có thể thay thế dict bằng một đối tượng bộ sưu tập. Điều này hỗ trợ bổ sung và trừ các quầy.2 silver badges7 bronze badges
Đã trả lời ngày 16 tháng 8 năm 2010 lúc 6:41
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
0Dave Kirbydave KirbyAug 13, 2019 at 0:03
25.1k5 Huy hiệu vàng65 Huy hiệu bạc82 Huy hiệu Đồng
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
1Đây là một cái đẹp hợp lý.
Đã trả lời ngày 30 tháng 12 năm 2015 lúc 11:05Jul 29, 2016 at 15:30