Сортировать список dicts по значениям dict - PullRequest
17 голосов
/ 21 мая 2010

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

[{'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}]

Я бы хотел отсортировать его по названию, поэтому элементы с A идут перед 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, title_url, затем id?

Ответы [ 4 ]

20 голосов
/ 21 мая 2010
l.sort(key=lambda x:x['title'])

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

l.sort(key=lambda x:(x['title'], x['title_url'], x['id']))
19 голосов
/ 21 мая 2010

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

import operator
L.sort(key=operator.itemgetter('title','title_url','id'))
2 голосов
/ 21 мая 2010

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

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

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

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

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

0 голосов
/ 21 мая 2010
originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title']))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...