2011-08-25 10 views
37

Tôi có một cuốn từ điển như thế này:5 giá trị tối đa trong một cuốn từ điển python

A = {'a':10, 'b':843, 'c': 39,.....} 

Tôi muốn để có được 5 giá trị tối đa của dict này và lưu trữ một dict mới với điều này. Để có được giá trị tối đa tôi đã làm:

max(A.iteritems(), key=operator.itemgetter(1))[0:] 

Có lẽ đó là một nhiệm vụ dễ dàng, nhưng tôi bị kẹt trong một thời gian dài. Hãy giúp tôi!!!

Trả lời

48

Bạn đang đóng cửa. Bạn có thể loại danh sách sử dụng sorted[docs] và lấy năm yếu tố đầu tiên:

newA = dict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=True)[:5]) 

Xem thêm: Python Sorting HowTo

+0

cảm ơn bạn !!!! ... nó thực sự giúp tôi !!! :) – Alejandro

+3

Điều này có thể không hiệu quả đối với một từ điển lớn, nhưng một giải pháp hiệu quả hơn sẽ phức tạp hơn nhiều. (Ví dụ, bạn có thể thực hiện một Quicksort một phần mà không bận tâm để sắp xếp cả hai phân vùng khi phân vùng cao hơn có 5 hoặc nhiều phần tử.) Rất có thể kỹ thuật 'được sắp xếp' đủ tốt cho các mục đích của OP. –

+0

@Keith: Có bạn nói đúng. –

1

Hãy thử điều này:

dict(sorted(A.iteritems(), key=operator.itemgetter(1), reverse=True)[:5]) 
+0

cảm ơn bạn !!!! ... nó thực sự giúp tôi !!! :) – Alejandro

73

Không cần phải sử dụng iteritems và itemgetter. Phương thức của riêng dict hoạt động tốt.

max(A, key=A.get) 

Tương tự như vậy để phân loại:

sorted(A, key=A.get, reverse=True)[:5] 

Cuối cùng, nếu kích thước dict là vô biên, sử dụng một đống cuối cùng sẽ được nhanh hơn so với một loại đầy đủ.

import heapq 
heapq.nlargest(5, A, key=A.get) 

Để biết thêm thông tin, hãy xem heapq documentation.

+4

+1 cho 'heapq', tôi không biết cái này. –

+0

Tôi nghi ngờ nó sẽ hoạt động nếu 7 giá trị giống nhau, nó sẽ vẫn trả lại 5 giá trị –

+0

Cảm ơn, điều này là tốt. Có vẻ như một lựa chọn không hoạt động cho python3.4 – user1953366

23

Bạn có thể sử dụng collections.Counter đây:

dict(Counter(A).most_common(5))

Ví dụ:

>>> from collections import Counter 
>>> A = {'a' : 1, 'b' : 3, 'c' : 2, 'd' : 4, 'e' : 0, 'f' :5} 
>>> dict(Counter(A).most_common(5)) 
{'a': 1, 'c': 2, 'b': 3, 'd': 4, 'f': 5} 
+1

Đây là câu trả lời duy nhất trả về giá trị cũng như các khóa, ** cảm ơn bạn ** –