2012-03-29 86 views
19

Tôi có thể sắp xếp theo khóa hoặc giá trị, nhưng tôi cần nó được sắp xếp theo giá trị, sau đó nhấn phím, trong một dòng. Để giải thích điều này tốt hơn tôi có thể cho bạn thấy vấn đề của tôi:Sắp xếp từ điển theo giá trị, sau đó nhập

dict = {'apple': 2, 'banana': 3, 'almond':2 , 'beetroot': 3, 'peach': 4} 

Tôi muốn đầu ra của tôi được sắp xếp giảm dần theo giá trị của họ và sau đó tăng dần (A-Z) bởi chính họ (theo thứ tự abc). Kết quả trong một danh sách như vậy:

Với sản lượng: ['peach', 'banana', 'beetroot', 'almond', 'apple']

Cách duy nhất tôi biết làm thế nào để làm điều đó cho đến nay là:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k))] 

Với sản lượng: ['almond', 'apple', 'banana', 'beetroot', 'peach']

Vì vậy, nó đã sắp xếp các giá trị theo thứ tự tăng dần và các phím theo thứ tự abc theo thứ tự tăng dần (AZ). Vì vậy, nếu tôi đảo ngược này:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k), reverse=True)] 

Với sản lượng: ['peach', 'beetroot', 'banana', 'apple', 'almond']

Nó đã sắp xếp các giá trị trong thứ tự giảm dần và các phím theo thứ tự abc theo thứ tự (Z-A) giảm dần.

Có cách nào tôi có thể sắp xếp các giá trị theo thứ tự giảm dần và các phím theo thứ tự tăng dần (tức là A-Z) và nhận được kết quả đầu ra mà tôi đã trình bày ở trên không?

Trả lời

34

Bạn cần tận dụng lợi thế của thực tế là các giá trị là số.

>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))] 
['peach', 'banana', 'beetroot', 'almond', 'apple'] 
+6

Chỉ cần một lời nhắc nhở rằng Python 3 loại bỏ tham số tuple giải nén, vì vậy dòng ở trên bây giờ sẽ được viết như '[v [0] cho v trong sắp xếp (d.items(), key = lambda kv : (-kv [1], kv [0]))] '. Xem PEP 3113 https://www.python.org/dev/peps/pep-3113/ –

+0

Chức năng chính cũng có thể được viết là 'operator.itemgetter (1, 0)' * nếu * bạn không phải đảo ngược thứ tự của một khóa/giá trị. – Moberg

5

Để sắp xếp theo giá trị giảm dần, đối với số lượng âm, để sắp xếp theo giá trị âm tăng dần.

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))] 
1
>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4} 
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))] 
['peach', 'banana', 'beetroot', 'almond', 'apple'] 
Các vấn đề liên quan