什么是重新排序由dicts组成的列表的Pythonic方法?

Sam*_*nga 4 python sorting lambda

我有以下列表:

list = [{'nr' : 2, 'name': 'streamname'}, {'nr' : 3,'name': 'streamname'}, {'nr' : 1, 'name': 'streamname'}]
Run Code Online (Sandbox Code Playgroud)

那么我如何在python中以高效的方式重新排序呢?

list = [{'nr' : 1, 'name': 'streamname'}, {'nr' : 2,'name': 'streamname'}, {'nr' : 3, 'name': 'streamname'}]
Run Code Online (Sandbox Code Playgroud)

我想出了使用sort并创建一个lambda函数来对它进行排序.这是一个好方法吗?它有效吗?

list.sort(cmp=lambda x,y: cmp(x['nr'], y['nr']))
Run Code Online (Sandbox Code Playgroud)

Len*_*bro 12

不,使用cmp=效率不高.请key=改用.像这样:

sorted(list, key=lambda x: x['nr'])
Run Code Online (Sandbox Code Playgroud)

原因很简单:cmp比较两个对象.如果列表很长,则可以对两个对象进行多种组合比较,因此列出两倍长度的列表需要两倍多的排序时间.

key事实并非如此,因此排序长列表快得多.

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

此外,sorted()有一个好处.sort(),它可以采取任何迭代,而.sort()inly适用于列表.

  • 您也可以使用`operator`模块中的`itemgetter`,而不必编写自己的lambda函数,它也会更快. (4认同)
  • @Piotr - 每个`cmp`操作需要比较两个变量 - 用`key`你定义这些变量,其余的是简单的比较...想象你可以使用`cmp`如果还有其它东西而不是简单的<=>比较(特殊功能或其他标准) (2认同)
  • 在列表`sort`方法和通用`sorted`函数之间要记住的另一个可能重要的区别是,前者在就地对列表进行排序但不返回任何内容,而后者仅保留原始内容并返回新的一个. (2认同)