2012-10-20 61 views
5

Tôi có một cuốn từ điển trong các hình thức:trung bình của các bộ

{"a":(1, 0.1) , "b":(2, 0.2) , ...} 

Mỗi ngoặc là một tuple tương ứng với (điểm số, độ lệch chuẩn). Làm cách nào để lấy số trung bình của số nguyên đầu tiên trong mỗi bộ? Tôi đã thử điều này:

for word in d: 
    (score, std) = d[word] 
    d[word]=float(score),float(std) 
    if word in string: 
     number = len(string) 
     v = sum(score) 
     return (v)/number 

Nhận lỗi này:

v = sum(score) 
TypeError: 'int' object is not iterable 

Trả lời

7

Thật dễ dàng để làm bằng list comprehensions. Trước tiên, bạn có thể nhận tất cả các giá trị từ điển từ d.values(). Để tạo danh sách chỉ mục đầu tiên trong mỗi giá trị bạn tạo danh sách như [v[0] for v in d.values()]. Sau đó, chỉ lấy tổng của các phần tử đó và chia cho số mục trong từ điển:

sum([v[0] for v in d.values()])/float(len(d)) 

Như Pedro đã chỉ ra đúng, điều này thực sự tạo danh sách, sau đó thực hiện tổng. Nếu bạn có một từ điển lớn, điều này có thể chiếm một bộ nhớ và không hiệu quả, vì vậy bạn sẽ muốn có một generator expression thay vì một danh sách hiểu. Trong trường hợp này, điều đó chỉ có nghĩa là loại bỏ một cặp ngoặc đơn:

sum(v[0] for v in d.values())/float(len(d)) 

Hai phương pháp được so sánh in another question.

+2

Bạn không thực sự cần danh sách hiểu, 'tổng hợp' sẽ thực hiện bất kỳ lần lặp nào, do đó biểu thức trình tạo trong' sum (v [0] cho v trong d.values ​​()) 'sẽ hoạt động mà không cần tạo danh sách trung gian . –

+0

Điểm tuyệt vời. Tôi chỉ nghĩ rằng việc xây dựng các biểu thức như thế này là một chút rõ ràng hơn. – Mike

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