如何按特定键的值对词典列表进行排序?鉴于:
[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
按名称排序时,应为:
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]
如何按特定键的值对词典列表进行排序?鉴于:
[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
按名称排序时,应为:
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]
当前回答
import operator
要按key='name'对词典列表进行排序:
list_of_dicts.sort(key=operator.itemgetter('name'))
要按key='age'对词典列表进行排序,请执行以下操作:
list_of_dicts.sort(key=operator.itemgetter('age'))
其他回答
我一直是lambda过滤器的忠实粉丝。然而,若考虑到时间复杂性,这并不是最好的选择。
第一个选项
sorted_list = sorted(list_to_sort, key= lambda x: x['name'])
# Returns list of values
第二个选项
list_to_sort.sort(key=operator.itemgetter('name'))
# Edits the list, and does not return a new list
快速比较执行时间
# First option
python3.6 -m timeit -s "list_to_sort = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}, {'name':'Faaa', 'age':57}, {'name':'Errr', 'age':20}]" -s "sorted_l=[]" "sorted_l = sorted(list_to_sort, key=lambda e: e['name'])"
1000000个循环,最好为3个:每个循环0.736µsec
# Second option
python3.6 -m timeit -s "list_to_sort = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}, {'name':'Faaa', 'age':57}, {'name':'Errr', 'age':20}]" -s "sorted_l=[]" -s "import operator" "list_to_sort.sort(key=operator.itemgetter('name'))"
1000000个循环,最好为3个:每个循环0.438µsec
使用来自Perl的Schwartzian变换,
py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
do
sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]
给予
>>> result
[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]
有关Perl Schwartzian转换的更多信息:
在计算机科学中,施瓦茨变换是一种Perl编程用于提高项目列表排序效率的习惯用法。这当排序为实际上基于元素,其中计算该属性是一项密集的操作应执行最少次数。施瓦茨学派Transform的显著之处在于它不使用命名的临时数组。
a = [{'name':'Homer', 'age':39}, ...]
# This changes the list a
a.sort(key=lambda k : k['name'])
# This returns a new list (a is not modified)
sorted(a, key=lambda k : k['name'])
我猜你的意思是:
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
其排序如下:
sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))
import operator
要按key='name'对词典列表进行排序:
list_of_dicts.sort(key=operator.itemgetter('name'))
要按key='age'对词典列表进行排序,请执行以下操作:
list_of_dicts.sort(key=operator.itemgetter('age'))