重新排列由字典组成的列表的Pythonic方式是什么?

4

我有以下列表:

list = [{'nr' : 2, 'name': 'streamname'}, {'nr' : 3,'name': 'streamname'}, {'nr' : 1, 'name': 'streamname'}]

那么,如何以高效的方式用Python重新排序,使其变为像这样的顺序?
list = [{'nr' : 1, 'name': 'streamname'}, {'nr' : 2,'name': 'streamname'}, {'nr' : 3, 'name': 'streamname'}]

我想到了使用排序和创建lambda函数来对其进行排序。这是一个好方法吗?并且它有效率吗?

list.sort(cmp=lambda x,y: cmp(x['nr'], y['nr']))
2个回答

12
不,使用cmp=并不高效。请使用key=代替。形式如下:
sorted(list, key=lambda x: x['nr'])

原因很简单:cmp比较两个对象。如果列表很长,您可以有许多组合的两个对象要比较,因此长度为两倍的列表排序所需的时间远远不止两倍。

但使用key则不是这种情况,因此对于长列表排序要快得多。

但使用key而不是cmp的主要原因是它更容易使用。

sorted()还具有优于.sort()的优点,它可以接受任何可迭代的内容,而.sort()仅适用于列表。


是的,我正在研究它,但当我使用key=x['nr']时它没有起作用,有点愚蠢,我没有为此编写一个lambda函数。现在它运行得很好!我想很快就会接受你的答案,但我会保持开放状态几个小时。 - Sam Stoelinga
4
你也可以使用 operator 模块中的itemgetter代替编写自己的 lambda 函数,这样会更快。 - milkypostman
2
@Piotr - 每个 cmp 操作都需要比较两个变量 - 通过 key 定义这些变量,其余部分是简单的比较... 想象一下,如果有其他特殊函数或标准需要进行比较而不仅仅是简单的 < = > 比较,那么你可以使用 cmp - eumiro
@Piotr Dobrogast:重点是cmp方法需要为每次比较调用一次,但是key方法只需要为每个值调用一次。昂贵的是调用,而不是比较。 - Lennart Regebro
2
在使用列表的 sort 方法和通用的 sorted 函数时需要记住的另一个可能重要的区别是,前者会就地对列表进行排序但不返回任何内容,而后者则保留原始列表并返回一个新列表。 - martineau
显示剩余3条评论

3
mylist.sort(key=operator.itemgetter('nr'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接