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