Ответ 1
Гипоаллергенная альтернатива для тех, кто чихает при приближении лямбда:
import operator
L.sort(key=operator.itemgetter('title','title_url','id'))
У меня есть список словарей:
[{'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?
Гипоаллергенная альтернатива для тех, кто чихает при приближении лямбда:
import operator
L.sort(key=operator.itemgetter('title','title_url','id'))
l.sort(key=lambda x:x['title'])
Сортировка с несколькими ключами, предполагая все в порядке возрастания:
l.sort(key=lambda x:(x['title'], x['title_url'], x['id']))
Вызвать .sort(fn)
в списке, где fn
- это функция, которая сравнивает значения заголовка и возвращает результат сравнения.
mylist.sort(lambda x,y: cmp(x['title'], y['title']))
В более поздних версиях Python (2.4+) гораздо лучше просто использовать ключ сортировки:
mylist.sort(key=lambda x:x['title'])
Кроме того, словари гарантированно сохраняют свой порядок, должны ли вы выполнять итерацию по ключам/значениям, если больше нет добавлений/абстракций. Однако, если вы добавляете или удаляете элементы, все ставки отключены, для этого нет никакой гарантии.
originalList.sort(lambda d1, d2: cmp(d1['title'], d2['title']))
Хотя это только сортировка по типу и порядку после undefined. Выполнение нескольких уровней было бы болезненным таким образом.