2012-03-24 36 views
6

Tôi cần có đại diện được sắp xếp của một dict, được sắp xếp theo thứ tự giảm dần của giá trị (giá trị lớn nhất trong dict được hiển thị trước).giá trị phân loại của python dict sử dụng hàm dựng sẵn được sắp xếp

mẫu:

mydict={u'jon':30,u'den':26,u'rob':42,u'jaime':31} 

tôi cần phải cho họ thấy như

rob=42 
jaime=31 
jon=30 
den=28 

Tôi cố gắng này

from operator import itemgetter 
sortedvalues=sorted(mydict,key=itemgetter(1)) 

Khi tôi in trong danh sách tôi nhận được

[u'jaime', u'den', u'rob', u'jon'] 

Danh sách này không có thứ tự! Tôi có thiếu điều gì đó về việc sử dụng nội trang được sắp xếp không? hoặc tôi đang sử dụng itemgetter không chính xác?

Trả lời

11

Đây là một vấn đề thú vị vì bạn đã không gây ra một lỗi như bạn sẽ có nếu các phím là của một loại không lập chỉ mục (nói số nguyên), và điều này là do một loạt tinh tế của sự vật:

  1. sắp xếp (mydict, ...) cố gắng lặp một cuốn từ điển bằng cách sử dụng tương đương với iter(mydict) mà sẽ gọi mydict.__iter__()
  2. lặp lại một từ điển mang lại phím của nó, có hiệu lực iter(mydict) cũng giống như mydict.iterkeys().
  3. Khóa của bạn là chuỗi và do chuỗi có thể lập chỉ mục, itemgetter(1) sẽ hoạt động trên giá trị chuỗi, nhận ký tự thứ hai trong chuỗi.

Mã bạn đã có thể đã thất bại với một IndexError nếu bất kỳ chuỗi nào có độ dài 1-char, bạn chỉ may mắn sau. (hoặc không, tùy thuộc vào cách bạn nhìn vào nó, vì việc lấy IndexError sẽ khiến bạn nhận thức được vấn đề sớm hơn.)

Những gì bạn muốn làm gì nếu bạn chỉ muốn các giá trị là:

sorted(mydict.values(), reverse=True) 

Và nếu bạn muốn các phím cũng theo cặp, bạn muốn

sorted(mydict.iteritems(), key=itemgetter(1), reverse=True) 
+1

tôi nhận ra rằng ngay trước khi đọc câu trả lời này! và thay đổi thành mydict.iteritems() ..thanks cho sự giúp đỡ –

+0

khi chúng ta nên sử dụng dict.iteritems() trên dict.items()? –

+1

Nếu bạn muốn chỉ các phím: 'được sắp xếp (mydict, key = mydict.get, reverse = True)' –

5

Chúng được sắp xếp theo chữ thứ hai trong tên; lặp lại trên một dict mang lại các khóa của nó.

sorteditems = sorted(mydict.iteritems(), key=itemgetter(1)) 
3

iterating trên một cuốn từ điển (đó là chức năng của sorted) sẽ chỉ cung cấp cho bạn khóa của nó:

>>> sorted(mydict) 
[u'den', u'jaime', u'jon', u'rob'] 

Thay vào đó bạn muốn sắp xếp tất cả các phím và các giá trị - để làm điều này, bạn sẽ sử dụng mydict.items() (hoặc mydict.iteritems(), đó là hiệu quả hơn với dicts lớn):

>>> sorted(mydict.items()) 
[(u'den', 26), (u'jaime', 31), (u'jon', 30), (u'rob', 42)] 

Sau đó, mã của bạn sẽ làm việc như mong đợi:

>>> from operator import itemgetter 
>>> sorted(mydict.items(), key = itemgetter(1)) 
[(u'den', 26), (u'jon', 30), (u'jaime', 31), (u'rob', 42)] 

Bạn cũng có thể muốn sắp xếp với chìa khóa của dict như giá trị loại thứ cấp, trong trường hợp nhiều phím có cùng giá trị:

>>> mydict={u'a': 1, 'z': 1, 'd': 1} 
>>> sorted(mydict.items(), key = itemgetter(1)) 
[(u'a', 1), ('z', 1), ('d', 1)] 
>>> sorted(mydict.items(), key = itemgetter(1, 0)) 
[(u'a', 1), ('d', 1), ('z', 1)] 
Các vấn đề liên quan