def sort_key_func(item):
""" helper function used to sort list of dicts
:param item: dict
:return: sorted list of tuples (k, v)
"""
pairs = []
for k, v in item.items():
pairs.append((k, v))
return sorted(pairs)
sorted(A, key=sort_key_func)
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'])
18 回答
这是my answer to a related question on sorting by multiple columns . 它也适用于列数仅为1的退化情况 .
要按key ='name'对字典列表进行排序:
按键='年龄'对字典列表进行排序:
这是另一种通用解决方案 - 它按键和值对dict元素进行排序 . 它的优点 - 不需要指定键,如果某些词典中缺少某些键,它仍然可以工作 .
如果要按多个键对列表进行排序,可以执行以下操作:
它相当hackish,因为它依赖于将值转换为单个字符串表示以进行比较,但它对于包含负数的数字的预期工作(尽管如果使用数字,则需要使用零填充来适当地格式化字符串)
您必须实现自己的比较函数,该函数将按名称键的值比较字典 . 见Sorting Mini-HOW TO from PythonInfo Wiki
您可以使用以下代码
使用pandas包是另一种方法,虽然它的大规模运行时比其他人提出的更传统的方法要慢得多:
以下是一个小列表和一个大的(100k)dicts列表的一些基准值:
有时我们需要使用
lower()
'key'用于按任意值排序,'itemgetter'将该值设置为每个项的'name'属性 .
使用密钥而不是cmp可能看起来更干净:
或者作为J.F.Sebastian和其他人的建议,
为了完整性(如fitzgeraldsteele的评论中所指出),添加
reverse=True
以降序排序my_list
现在就是你想要的 .(3 years later) Edited to add:
新的
key
参数更有效,更整洁 . 现在更好的答案如下:......作为IMO,lambda比
operator.itemgetter
更容易理解,但YMMV .您可以使用自定义比较功能,也可以传入计算自定义排序键的函数 . 这通常更有效,因为每个项目只计算一次密钥,而比较函数将被调用多次 .
你可以这样做:
但标准库包含获取任意对象项的通用例程:
itemgetter
. 所以试试这个:让我说我是一个字典D与下面的元素 . 要排序只使用sorted中的key参数来传递自定义函数,如下所示
https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions
我想你的意思是:
这将按如下方式排序:
如果您不需要
dictionaries
的原始list
,则可以使用自定义键功能使用sort()
方法对其进行原位修改 .主要功能:
list
要排序:就地排序:
如果你需要原始
list
,调用sorted()
函数传递list
和键函数,然后将返回的有序list
分配给一个新变量:打印
data_one
和new_data
.我试过这样的事情:
它也适用于整数 .
使用Perl的Schwartzian变换,
做
给
更多关于Perl Schwartzian transform