2013-01-22 36 views
18

tôi cần phải sắp xếp một cuốn từ điển bằng cách đầu tiên, đánh giá cao với reverse=True, và cho các giá trị lặp đi lặp lại, sắp xếp theo phím, reverse=FalseSắp xếp một danh sách các hàng theo giá trị thứ hai, ngược = True và sau đó theo mã, đảo ngược = False

cho đến nay, tôi có điều này

dict = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
sorted(dict.items(), key=lambda x: (x[1],x[1]), reverse=True) 

trả về ...

[('B', 3), ('A', 2), ('J', 1), ('I', 1), ('A', 1)] 

nhưng tôi cần nó để được:

[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 

như bạn có thể thấy, khi giá trị bằng nhau, tôi chỉ có thể sắp xếp khóa theo kiểu giảm dần như được chỉ định ... Nhưng làm cách nào tôi có thể sắp xếp chúng theo kiểu ngày càng tăng?

+4

'dict' là danh sách - Và thậm chí không thực sự là một danh sách phù hợp cho biến thành một cuốn từ điển như nó đã có thể lặp đi lặp lại phím ... – mgilson

+0

nhận nó để làm việc nhờ mgilson, tôi đã cố gắng một cái gì đó tương tự nhưng buồn ngủ và không thể nghĩ thẳng. Cảm ơn! –

Trả lời

27

Các công trình sau đây với sự đóng góp của bạn:

d = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
sorted(d,key=lambda x:(-x[1],x[0])) 

Từ "giá trị" của bạn là số, bạn có thể dễ dàng đảo ngược thứ tự sắp xếp bằng cách thay đổi dấu.

Nói cách khác, sắp xếp này sắp xếp thứ tự theo giá trị (-x[1]) (dấu âm đặt số lớn trước) và sau đó cho các số giống nhau, nó đặt hàng theo khóa (x[0]).

Nếu giá trị của bạn có thể không dễ dàng như vậy được "phủ nhận" để đặt các món hàng đầu tiên, một công việc xung quanh dễ dàng là để sắp xếp hai lần:

from operator import itemgetter 
d.sort(key=itemgetter(0)) 
d.sort(key=itemgetter(1),reverse=True) 

mà làm việc vì phân loại python là ổn định.

3
In [4]: l = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 

In [5]: sorted(l, key=lambda (x,y):(-y,x)) 
Out[5]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
1

bạn có thể sử dụng collections.defaultdict:

In [48]: from collections import defaultdict 

In [49]: dic=[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 

In [50]: d=defaultdict(list) 

In [51]: for x,y in dic: 
    d[y].append(x) 
    d[y].sort()   #sort the list 

tại d là một cái gì đó như:

defaultdict(<type 'list'>, {1: ['A', 'I', 'J'], 2: ['A'], 3: ['B']} 

tức là A mới dict với 1,2,3... như phím và bảng chữ cái tương ứng với lưu trữ trong danh sách như các giá trị.

Bây giờ, bạn có thể lặp qua sorted(d.items) và nhận kết quả mong muốn bằng cách sử dụng itertools.chain()itertools.product().

In [65]: l=[ product(y,[x]) for x,y in sorted(d.items(),reverse=True)] 

In [66]: list(chain(*l)) 
Out[66]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] 
+0

Tôi không thực sự chắc chắn những gì bạn đang hiển thị ở đây ... Bạn có lẽ nên cung cấp một chút giải thích thêm: P – mgilson

+0

@ mgilson oops !! –

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