2012-06-06 2 views
5

У меня есть следующий список словарейСортировка списка dicts по Dict значения

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

Как я могу сортировать его получить:

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

я имею в виду, чтобы отсортировать список по его dicts 'в порядке убывания.

+0

Каждый из этих словарей имеют разные ключи. Есть ли лучший тип данных для этого? – tlunter

ответ

1

Вы можете передать параметр key методе list.sort(), поэтому сравнение будет производиться в зависимости от возвращающего значения 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}] 

В этом случае ключ является функцией, которая принимает словарь d и получает список его значений с .values(). Поскольку существует только одно значение, мы получаем это единственное значение из возвращаемого списка. Затем метод list.sort() будет сравнивать возвращаемые значения, а не сами словари, при сортировке.

+0

Это дает вид в порядке возрастания, OP хочет уменьшаться. – raym0nd

+2

@ raym0nd ok, исправлено, хотя я бы сказал, что я бы предпочел решение HodfHod в любом случае :) – brandizzi

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

В дополнение к ответу brandizzi, вы могли бы пойти с:

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

в значительной степени то же самое, но, возможно, более идиоматических.

+0

+1 Согласен, это лучший ответ, если в вопросе не указано, что для сортировки будет использоваться только первый элемент. – jamylak

+0

эй, как я могу извлечь значение из отсортированного 'a' dict для rec int? , например. 'for b in a: print a [i] .keys() i + = 1' , но python говорит, что это еще список, мне нужно восстановить int. Как мне это сделать ? – user1403568

+0

@ user1403568 try 'for b in a: print b.keys() [0]'. который будет извлекать ключи, поэтому вы закончите распечатку: 43, 3, 36, 2, 23. Если вы хотите вместо этого использовать значения (например, 123,103,36,102,100), используйте 'b.values ​​() [0]'. – HodofHod

0

Я предпочел бы использовать (или, по крайней мере, иметь в виду) .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}] 
Смежные вопросы