Làm thế nào để tổng hợp tất cả các giá trị trong một từ điển?


239

Giả sử tôi có một từ điển trong đó các khóa ánh xạ tới các số nguyên như:

d = {'key1': 1,'key2': 14,'key3': 47}

Có cách nào cú pháp tối giản để trả lại tổng của các giá trị trong d-ie 62trong trường hợp này?


2
Chỉ để cho vui: thực hiện sumbản thân theo cách reduce- reducelà một hình thức tổng quát hơn (ví dụ sum, minmaxtất cả có thể được viết dưới dạng reduce) và có thể giải quyết các vấn đề khác (ví dụ product) một cách dễ dàng.

1
Điều gì về câu nói của Guido - Tôi nghĩ rằng tôi nhớ chính xác điều này - sự giảm bớt đó sẽ biến mất? Tôi với bạn Tại sao loại bỏ nó khỏi ngôn ngữ?
bạch tuộc

Câu trả lời:


471

Như bạn mong đợi:

sum(d.values())

1
Chà, Python 2.7.12cũng hoạt động tốt vớisum(d.values())
LancelotHolmes

7
@LatteryotHolmes Có, nhưng điều đó xây dựng một danh sách trong bộ nhớ và do đó có thể chậm hơn / gần hơn với giới hạn tài nguyên cho các từ điển lớn. Do đó, câu trả lời này cho biết "bạn có thể muốn sử dụng" thay vì "bạn phải sử dụng" khi thảo luận về Python 2.
phihag

Đẹp! Tôi đã tìm kiếm nó chỉ vì tôi biết sẽ có một cái gì đó như thế. Không phải là nó mất quá nhiều công sức để viết một cái chết ngớ ngẩn cho vòng lặp;)
runlevel0

Tôi không biết bạn có yêu trăn không, nếu bạn yêu trăn 3 hay thực sự đang đề cập đến một con trăn 2
Lucas Vazquez

1
@LucasVazquez Điều này đề cập đến Python 2 (hoặc 1). Tôi đã xóa nó vì ngày nay nó không liên quan - ngay cả khi bạn viết mã mới bằng Python2, bạn vẫn có thể sử dụng d.values().
phihag

70

Trong Python 2, bạn có thể tránh tạo một bản sao tạm thời của tất cả các giá trị bằng cách sử dụng itervalues()phương thức từ điển, trả về một trình lặp của các khóa của từ điển:

sum(d.itervalues())

Trong Python 3, bạn chỉ có thể sử dụng d.values()vì phương thức đó đã được thay đổi để làm điều đó (và itervalues()đã bị xóa do không còn cần thiết nữa).

Để dễ dàng viết mã độc lập phiên bản luôn lặp lại các giá trị của khóa từ điển, một hàm tiện ích có thể hữu ích:

import sys

def itervalues(d):
    return iter(getattr(d, ('itervalues', 'values')[sys.version_info[0]>2])())

sum(itervalues(d))

Đây thực chất là những gì sixmô-đun của Benjamin Peterson làm.


5
yup, mặc dù điều này không áp dụng cho python 3.
tokland

15

Chắc chắn là có. Đây là một cách để tổng hợp các giá trị của một từ điển.

>>> d = {'key1':1,'key2':14,'key3':47}
>>> sum(d.values())
62

4
d = {'key1': 1,'key2': 14,'key3': 47}
sum1 = sum(d[item] for item in d)
print(sum1)

bạn có thể làm điều đó bằng cách sử dụng vòng lặp for


3

Tôi cảm thấy sum(d.values())là cách hiệu quả nhất để có được số tiền.

Bạn cũng có thể thử hàm giảm để tính tổng cùng với biểu thức lambda:

reduce(lambda x,y:x+y,d.values())


0

câu trả lời của phihag (và những câu tương tự) sẽ không hoạt động trong python3.

Đối với trăn 3:

d = {'key1': 1,'key2': 14,'key3': 47}
sum(list(d.values()))

Cập nhật! Có những phàn nàn rằng nó không hoạt động! Tôi chỉ đính kèm một ảnh chụp màn hình từ thiết bị đầu cuối của tôi. Có thể là một số không phù hợp trong các phiên bản, vv

nhập mô tả hình ảnh ở đây


Vấn đề tương tự tồn tại ngay cả khi chúng ta thử theo cách này
jeevan kishore

Nó chỉ hoạt động tốt cho tôi! Tôi đã cập nhật câu trả lời của mình bằng một ảnh chụp màn hình (không thể thực hiện ở đây); nó có thể có liên quan đến các phiên bản ...
Reza

0

Bạn có thể xem xét 'cho vòng lặp' cho việc này:

  d = {'data': 100, 'data2': 200, 'data3': 500}
  total = 0
  for i in d.values():
        total += i

tổng = 800


1
Hoặc chỉ sum(d.values()), kể từ khi .values()trả về a List.
Linny

Vâng, đó là một cách khác là tốt.
Rahul Patel

-1

Bạn có thể lấy một trình tạo tất cả các giá trị trong từ điển, sau đó bỏ nó vào danh sách và sử dụng hàm sum () để lấy tổng của tất cả các giá trị.

Thí dụ:

c={"a":123,"b":4,"d":4,"c":-1001,"x":2002,"y":1001}

sum(list(c.values()))

1
Làm thế nào đây là một câu trả lời, nếu nó không hoạt động. Nhìn giống như một bình luận cho câu trả lời khác.
Martin Thøgersen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.