Подтвердить что ты не робот

Сортировка списка 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}]

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

4b9b3361

Ответ 1

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

import operator
L.sort(key=operator.itemgetter('title','title_url','id'))

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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