2011-10-12 46 views
20

Điều này có vẻ như nó phải là một bản dupe nhưng SO-search-fu của tôi ngày nay ...Sắp xếp một từ điển theo giá trị, sau đó bằng phím

Giả sử tôi có từ điển của khóa/giá trị nguyên, cách Tôi sắp xếp từ điển theo các giá trị giảm dần, sau đó bằng phím giảm dần (cho các giá trị chung).

Input:

{12:2, 9:1, 14:2} 
{100:1, 90:4, 99:3, 92:1, 101:1} 

Output:

[(14,2), (12,2), (9,1)] # output from print 
[(90,4), (99,3), (101,1), (100,1), (92,1)] 

Trả lời

37
In [62]: y={100:1, 90:4, 99:3, 92:1, 101:1} 
In [63]: sorted(y.items(), key=lambda x: (x[1],x[0]), reverse=True) 
Out[63]: [(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)] 

Các key=lambda x: (x[1],x[0]) nói sorted rằng đối với mỗi mục x trong y.items(), sử dụng (x[1],x[0]) như giá trị proxy để được sắp xếp. Kể từ x có dạng (key,value), (x[1],x[0]) sản lượng (value,key). Điều này gây ra sorted để sắp xếp trước value trước, sau đó bằng key cho bộ phận ngắt kết nối.

reverse=True yêu cầu sorted trình bày kết quả theo thứ tự giảm dần, thay vì tăng dần.

Xem điều này wiki page để biết hướng dẫn tuyệt vời về sắp xếp bằng Python.

PS. Tôi đã thử sử dụng key=reversed thay thế, nhưng reversed(x) trả về một trình lặp, không so sánh khi cần ở đây.

+1

+1: sử dụng rất tốt các tính năng built-in của Python. – EOL

+0

Tôi không nhận được cùng một đầu ra ... Tôi đã nhận được câu trả lời phiên bản đầu tiên và nó đã làm chính xác những gì tôi cần. –

+2

Đẹp, nhưng một chút criptic ... nhưng tôi không thể nghĩ về anythin đơn giản hơn. – Don

1

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

>>> d={100:1, 90:4, 99:3, 92:1, 101:1} 
>>> sorted(d.items(), lambda a,b:b[1]-a[1] or a[0]-b[0]) 
2

Có lẽ đây là rõ ràng hơn:

>>> y = {100:1, 90:4, 99:3, 92:1, 101:1} 
>>> reverse_comparison = lambda (a1, a2), (b1, b2):cmp((b2, b1), (a2, a1)) 
>>> sorted(y.items(), cmp=reverse_comparison) 
[(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)] 
Các vấn đề liên quan