2010-05-20 2 views
16

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

[{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}, 
{'title':'Apple News','title_url':'Apple_News','id':2}] 

Я хотел бы, чтобы отсортировать его по названию, так элементов с ходом до Z:

[{'title':'Apple News','title_url':'Apple_News','id':2}, 
{'title':'New York Times', 'title_url':'New_York_Times','id':4}, 
{'title':'USA Today','title_url':'USA_Today','id':6}] 

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

+0

Могу ли я спросить, почему вам нужно сортированный дикт? Обычно вы все равно получаете доступ к dict через ключи, поэтому порядок не имеет значения. –

+3

Э-э, это список диктонов Феликса. – Amber

+0

@Amber: Да, я вижу ... но в любом случае его второй вопрос нацелен на это;) –

ответ

2

Звоните .sort(fn) в список, где fn - это функция, которая сравнивает значения заголовков и возвращает результат сравнения.

mylist.sort(lambda x,y: cmp(x['title'], y['title'])) 

В более поздних версиях Python, хотя (2.4+), это гораздо лучше просто использовать ключ сортировки:

mylist.sort(key=lambda x:x['title']) 

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

-1
originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title'])) 

Хотя это только сортировка по типу и порядку после этого не определена. Выполнение нескольких уровней было бы болезненным таким образом.

+2

'cmp' устарел без уважительной причины поскольку «ключ» намного лучше. Сортировка на нескольких уровнях проста - просто используйте кортежи, см. Ответ Кенни. –

+1

Порядок после этого определяется как порядок, в котором они первоначально происходили. (Сорта Python стабильны.) –

17
l.sort(key=lambda x:x['title']) 

Для сортировки с несколькими ключами, предполагая, что все в порядке возрастания:

l.sort(key=lambda x:(x['title'], x['title_url'], x['id'])) 
+2

+1, используя 'key' и вытягивая правильный атрибут, является более правильным/чистым, чем просто использование' lambda' в качестве функции сортировки –

+2

Да, я просто помнил, что также - Python 2.4+ имеет их, поэтому они, вероятно, доступны. – Amber

19

гипоаллергенная альтернатива для тех, кто чихнул, когда подошел лямбды:

import operator 
L.sort(key=operator.itemgetter('title','title_url','id')) 
Смежные вопросы