2013-05-14 2 views
2

У меня есть этот список:сортировки списка словарей в Python

L = [{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}] 

Как сортировать этот список по country (или по status) элементы, ASC/DESC.

+0

Если эти словари соответствуют всем (т. е. все они имеют ключ «статус» и ключ «страна» и другие ключи), рассмотрите возможность использования экземпляров класса, созданного 'collections.name вместо dtuple'. Это сделает много вашего кода, включая сортировку, гораздо проще читать и писать. См. [Эту ссылку] (http://docs.python.org/2/library/collections.html#collections.namedtuple) для получения более подробной информации – kampu

ответ

9

Использование list.sort() для сортировки списка в месте или sorted, чтобы получить новый список:

>>> L = [{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}] 
>>> L.sort(key= lambda x:x['country']) 
>>> L 
[{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}] 

Вы можете передать факультативный ключевое слово аргумент reverse = True к sort и sorted отсортировать в порядке убывания.

Поскольку алфавит в верхнем регистре считается меньшим, чем соответствующая версия в малом корпусе (из-за их значения ASCII), вам также придется использовать str.lower.

>>> L.sort(key= lambda x:x['country'].lower()) 
>>> L 
[{'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'France'}, {'status': 1, 'country': 'usa'}] 
+2

+1 для 'list.sort' – jamylak

7
>>> from operator import itemgetter 
>>> L = [{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}] 
>>> sorted(L, key=itemgetter('country')) 
[{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}] 
>>> sorted(L, key=itemgetter('country'), reverse=True) 
[{'status': 1, 'country': 'usa'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'France'}] 
>>> sorted(L, key=itemgetter('status')) 
[{'status': 1, 'country': 'France'}, {'status': 1, 'country': 'canada'}, {'status': 1, 'country': 'usa'}] 
+2

+1 для itemgetter. –

+1

Я думаю, что мы должны использовать 'str.lower' здесь, поскольку словарь wise' canada' должен прибыть перед 'Францией'. –

+0

@AshwiniChaudhary, если это необходимо, тогда ваш ответ должен быть принят;) Я просто последовал тому, что задал вопрос, поэтому я оставлю это здесь для других людей, посещающих – jamylak

2

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

def by_country(x): 
    # For case insensitive ordering by country 
    return x['country'].lower() 

L.sort(key=by_country) 

Конечно, вы можете адаптировать для использования sorted(L, key=...) или reverse=True и т. д.

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