2010-08-05 16 views
18

Mam dict, który wygląda takJak sortować dict Pythona według wartości

{ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 }

I chciałbym, aby przekształcić go DESC i utworzyć listę tylko tych słów kluczowych. Na przykład, będzie to powrót

["keyword3" , "keyword1" , "keyword4" , "keyword2"]

Wszystkie przykłady I znalazły zastosowanie lambda i nie jestem bardzo silny z tym. Czy istnieje sposób, w jaki mógłbym przechodzić przez to i sortować je, gdybym jechał? Dzięki za wszelkie sugestie.

PS: Mogłabym stworzyć inny dyktando inaczej, gdyby to pomogło.

+0

możliwy duplikat [Sortuj słownik Pythona według wartości] (http://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value) – Teepeemm

Odpowiedz

40

Można użyć

res = list(sorted(theDict, key=theDict.__getitem__, reverse=True)) 

(nie trzeba się list w Pythonie 2.x)

theDict.__getitem__ jest rzeczywiście równoważne lambda x: theDict[x].

(A lambda jest tylko anonimowa funkcja. Na przykład

>>> g = lambda x: x + 5 
>>> g(123) 
128 

Jest to odpowiednik

>>> def h(x): 
... return x + 5 
>>> h(123) 
128 

)

+0

Bardzo ładne. Dziękuję Ci! –

+0

+1 Służy do numerycznego sortowania nazw plików zawierających liczby całkowite. names = {} dla f w sys.argv [1:]: robj = re.search ("([0-9] +)", f) jeśli robj nie jest żaden Brak: nazwy [f] = int (robj.group (1)) res = lista (posortowana (imiona, klucze = nazwy.__getitem__)) print "\ n" .join (res) –

2

zawsze robił to w ten sposób są tam .... zalety korzystania z posortowanej metody?

keys = dict.keys() 
keys.sort(lambda x,y: cmp(dict[x], dict[y])) 

okrzyki zrobił przeczytać część o nie przy użyciu lambda = (

+0

Jest to coś, czego naprawdę muszę się nauczyć. Dzięki! –

2

chciałbym wymyślić coś takiego:

[k for v, k in sorted(((v, k) for k, v in theDict.items()), reverse=True)] 

Ale KennyTM's solution jest o wiele ładniejsza :)

18
>>> d={ "keyword1":3 , "keyword2":1 , "keyword3":5 , "keyword4":2 } 
>>> sorted(d, key=d.get, reverse=True) 
['keyword3', 'keyword1', 'keyword4', 'keyword2'] 
1

Nie można sortować dyktowania, tylko po to, aby uzyskać reprezentację posortowanego dyktatu. Dicts są z natury pozbawione porządku, ale inne typy, takie jak listy i krotki, nie są. Potrzebujesz sortowanej reprezentacji, która będzie listą - prawdopodobnie listą krotek. Na przykład,

''' 
Sort the dictionary by score. if the score is same then sort them by name 
{ 
'Rahul' : {score : 75} 
'Suhas' : {score : 95} 
'Vanita' : {score : 56} 
'Dinesh' : {score : 78} 
'Anil' : {score : 69} 
'Anup' : {score : 95} 
} 
''' 
import operator 

x={'Rahul' : {'score' : 75},'Suhas' : {'score' : 95},'Vanita' : {'score' : 56}, 
    'Dinesh' : {'score' : 78},'Anil' : {'score' : 69},'Anup' : {'score' : 95} 
    } 
sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1)) 
print sorted_x 

Wydajność: [('Vanita', { 'wynik' 56}) ('Anil', { 'wynik' 69}) ('Rahula', { 'wynik ": 75}), (" Dinesh ", {'score': 78}), ('Anup', {'score': 95}), ('Suhas', {'score': 95})]

Powiązane problemy