2011-02-02 31 views
129

Hãy nói rằng tôi có một cuốn từ điển, trong đó các phím để nguyên như:Làm cách nào để tổng hợp tất cả các giá trị trong từ điển?

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 -i.e. 62 trong trường hợp này?

+2

Chỉ để cho vui: tự thực hiện 'sum' cho mình về mặt [' reduce'] (http://docs.python.org/library/functions.html) - 'reduce' là dạng tổng quát hơn (ví dụ:' sum', 'min' và' max' 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ề Guido nói - Tôi nghĩ tôi nhớ điều này một cách chính xác - mà giảm đi là đi? Tôi đi với bạn. Tại sao xóa nó khỏi ngôn ngữ? – octopusgrabbus

Trả lời

253

Như bạn mong muốn:

sum(d.values()) 

Trong Python < 3, bạn có thể muốn sử dụng itervalues thay vì (mà không xây dựng một danh sách tạm thời).

+0

Vâng, 'Python 2.7.12' cũng hoạt động tốt với' sum (d.values ​​()) ' – LancelotHolmes

+5

@LancelotHolmes Có, nhưng nó 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. Vì vậy, câu trả lời này nói rằng "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

11

Chắc chắn 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 
58

Trong Python 2 bạn có thể tránh làm cho 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 phương pháp itervalues() từ điển, mà trả về một iterator phím của từ điển:

sum(d.itervalues()) 

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

Để làm cho nó dễ dàng hơn để viết phiên bản mã độc lập mà luôn luôn lặp trên các giá trị của phím của từ điển, một chức năng 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)) 

này về cơ bản những gì mô-đun six Benjamin Peterson làm là.

+4

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

Các vấn đề liên quan