phím A của dict, ngược-sắp xếp theo các giá trị tương ứng, tốt nhất có thể được nhận như
sorted(adict, key=adict.get, reverse=True)
kể từ khi bạn muốn có chìa khóa/cặp giá trị, bạn có thể làm việc trên các mục như tất cả các câu trả lời khác được đề xuất, hoặc (để sử dụng phương thức ràng buộc adict.get
bị ràng buộc thay vì mục công cụ hoặc lambdas lạ ;-),
[(k, adict[k]) for k in sorted(adict, key=adict.get, reverse=True)]
Sửa: về hiệu suất, không có nhiều vào nó một trong hai cách:
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6))' '[(k, adict[k]) for k in sorted(adict, key=adict.get, reverse=True)]'
100000 loops, best of 3: 10.8 usec per loop
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6)); from operator import itemgetter' 'sorted(adict.iteritems(), key=itemgetter(1), reverse=True)'
100000 loops, best of 3: 9.66 usec per loop
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6))' 'sorted(adict.iteritems(), key=lambda (k,v): v, reverse=True)'
100000 loops, best of 3: 11.5 usec per loop
Vì vậy, giải pháp dựa trên .get
là giữa chừng smack ở hiệu suất giữa hai items
- dựa trên cơ sở - hơi chậm hơn itemgetter
, nhanh hơn một chút so với lambda
. Trong các trường hợp "nút cổ chai", trong đó các phân số micro giây là rất quan trọng đối với bạn, bằng mọi cách hãy tập trung vào điều đó. Trong những trường hợp bình thường, khi thao tác này chỉ là một bước trong một số nhiệm vụ lớn hơn và ít hơn một phần nghìn giây, thì việc tập trung vào sự đơn giản của thành ngữ get
là một lựa chọn hợp lý.
Biến thể 'adict.get' thực hiện tra cứu chính hai lần cho từng mục chính tả. '[(k, v) cho k, v trong sắp xếp (adict.iteritems(), key = itemgetter (1), reverse = True)]' thực hiện một lần. – jfs
Nếu bạn muốn các khóa có cùng giá trị được sắp xếp, có điều gì tốt hơn một "lambda khủng khiếp" không? – tgray
@ J.F. Sebastian: cho rằng vấn đề, bạn có thể thả các công cụ hiểu danh sách và chỉ sử dụng: 'sắp xếp (adict.iteritems(), key = itemgetter (1), reverse = True)'. Giống như Nadia. – hughdbrown