2014-11-14 3 views
3

У меня есть список словарей в Python, каждый из которых содержит только один цифровой ключ, и я хочу отсортировать их по их ключам. Пример:Сортировка списка словарей по ключу в Python

list = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}] 

Я хочу разобраться в этом и вернуть что-то вроде этого:

[{1.0: 'a'}, {1.0: 'c'}, {.98: 'b'}, {.56: 'a'}] 

В случае, когда ключевые значения одинаковы, я не забочусь, как те, которые сортируются. Я пробовал использовать .sort() или .sorted(), но мне трудно понять аргументы.

+3

'sorted (list, reverse = True)' должен делать трюк –

+0

Кстати, 'list' - это глобальная функция, поэтому это не лучший выбор для имени переменной. – twasbrillig

ответ

0

По крайней мере, в Python 3.3 комментарий @Hai Vu не работает, потому что он вызывает ошибку типа, так как dict() не является упорядоченным типом. Однако, комментарий подсказывает ответ, если мы можем преобразовать словарь в упорядочиваемой типа, как список кортежей, например:

>>>> L = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}] 
>>>> L2 = sorted([list(zip(x.keys(),x.values())) for x in L],reverse=True) 
>>>> L2 
[[(1.0, 'c')], [(1.0, 'a')], [(0.98, 'b')], [(0.56, 'a')]] 
>>>> [{k: v for (k,v) in x} for x in L2] 
[{1.0: 'c'}, {1.0: 'a'}, {0.98: 'b'}, {0.56: 'a'}] 

Начнем с приведенных данных, присвоенного L, а не list, чтобы избежать путаницы с ключевое слово list. Затем мы используем понимание списка, которое создает список списков кортежей, где каждый из подписок - это ключи с застежкой-молнией и значения каждого словаря. В качестве списков их можно сортировать по функции sorted().

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

+0

Я думаю, что объяснение того, что вы здесь делаете, сделало бы это великолепным ответом. – bwegs

+2

Это [Schwartzian_transform] (http://en.wikipedia.org/wiki/Schwartzian_transform).Это был обычный способ сделать этот тип сортировки до того, как был добавлен аргумент 'key' –

1

С Python 3+, так как он вызывает ошибку, как упоминает @Simon. Это зависит от ваших словарей, являющихся Singletons:

>>> lst = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}] 
>>> sorted(lst, key=lambda d: d.keys()[0], reverse=True) 
[{1.0: 'a'}, {1.0: 'c'}, {0.98: 'b'}, {0.56: 'a'}] 
2

Это будет работать в Python 2 и 3:

>>> mylist = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}] 

>>> sorted(mylist, key=lambda d: max(d.keys()), reverse=True) 
[{1.0: 'a'}, {1.0: 'c'}, {0.98: 'b'}, {0.56: 'a'}] 

Он использует sorted «S key аргумент для сортировки на основе наибольшего ключа каждого Dict, который в этом случае будет только первым, если у вас есть только один.

Другое решение может работать, но это намного проще.

P.S. Никогда не называйте свои переменные после того, как встроенные Python как list.

3

Это упрощенная версия @dkamins

>>> lst = [{.56: 'a'}, {1.0: 'a'}, {.98: 'b'}, {1.0: 'c'}] 
>>> sorted(lst, key=max, reverse=True) 
[{1.0: 'a'}, {1.0: 'c'}, {0.98: 'b'}, {0.56: 'a'}] 

max(d.keys()) напомним, что возвращает тот же результат, как max(d)

lambda d: max(d) просто оборачивает другую функцию вокруг вызова max поэтому мы можем выйти, что из

Смежные вопросы