2012-06-06 15 views
5

mam Poniższa lista słownikówSortowanie listy dicts przez dict wartości

a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}] 

Jak mogę posortować je dostać:

a = [{43:123}, {3:103}, {36:103}, {2:102}, {23:100}] 

To znaczy, aby posortować listę według swoich dicts "wartości w porządku malejącym.

+0

Każda z tych słowników mają różne klucze. Czy istnieje lepszy typ danych? – tlunter

Odpowiedz

1

można przekazać parametr key metody list.sort(), więc porównanie będzie w zależności od wartości Zwrot key:

>>> a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}] 
>>> a.sort(key=lambda d: d.values()[0], reversed=True) 
>>> a 
[{23: 100}, {2: 102}, {3: 103}, {36: 103}, {43: 123}] 

W tym przypadku kluczem jest funkcją, która odbiera słownika d i otrzymuje listę wartości z wartością .values(). Ponieważ istnieje tylko jedna wartość, otrzymujemy tę jedyną wartość z zwróconej listy. Następnie metoda list.sort() porównuje zwracane wartości, zamiast samych słowników, podczas sortowania.

+0

Daje to sort w porządku rosnącym, OP chciał zmniejszyć. – raym0nd

+2

@ raym0nd ok, naprawiony, chociaż powinienem powiedzieć, że wolałbym rozwiązanie HodfHod w każdym razie :) – brandizzi

3
>>> sorted(a, key=lambda i: i.values()[0], reverse=True) 
[{43: 123}, {3: 103}, {36: 103}, {2: 102}, {23: 100}] 
6

Oprócz odpowiedzi brandizzi jest, można iść z:

sorted(a, key=dict.values, reverse=True) 

niemal tak samo, ale być może bardziej idiomatyczne.

+0

+1 Zgadzam się, to jest lepsza odpowiedź, chyba że pytanie określa, że ​​tylko pierwszy przedmiot zostanie użyty do sortowania. – jamylak

+0

hej, jak mogę wyodrębnić wartość z posortowanego 'a' dict, aby uzyskać int? np. 'dla b w: wydrukuj [i] .keys() i + = 1' , ale python mówi, że wciąż jest listą, potrzebuję odebrać int. Jak mogę to zrobić ? – user1403568

+0

@ user1403568 spróbuj 'dla b w a: print b.keys() [0]'. który wyodrębni klucze, więc skończysz drukować: 43, 3, 36, 2, 23. Jeśli chcesz zamiast tego wartości (jak 123,103,36,102,100), użyj 'b.values ​​() [0]'. – HodofHod

0

wolałbym użyć (albo przynajmniej pamiętać) .itervalues()

In [25]: sorted(a, key=lambda x: x.itervalues().next, reverse=True) 
Out[25]: [{43: 123}, {36: 103}, {2: 102}, {23: 100}, {3: 103}] 
Powiązane problemy