如何在python排序(列表)中指定2个键?

alv*_*vas 17 python sorting key list

我如何排序的字符串列表key=len第一然后通过key=str?我尝试过以下但是没有给出我想要的那种:

>>> ls = ['foo','bar','foobar','barbar']
>>> 
>>> for i in sorted(ls):
...     print i
... 
bar
barbar
foo
foobar
>>>
>>> for i in sorted(ls, key=len):
...     print i
... 
foo
bar
foobar
barbar
>>> 
>>> for i in sorted(ls, key=str):
...     print i
... 
bar
barbar
foo
foobar
Run Code Online (Sandbox Code Playgroud)

我需要得到:

bar
foo
barbar
foobar
Run Code Online (Sandbox Code Playgroud)

roo*_*oot 27

定义一个键函数,它返回第一个项目所在的元组,len(str)第二个元素是字符串本身.然后按字典顺序比较元组.也就是说,首先比较长度; 如果它们相等,则比较字符串.

In [1]: ls = ['foo','bar','foobar','barbar']

In [2]: sorted(ls, key=lambda s: (len(s), s))
Out[2]: ['bar', 'foo', 'barbar', 'foobar']
Run Code Online (Sandbox Code Playgroud)

  • @Eric - Duh ......经过测试 - 我不得不说确实没有任何性能差异. (2认同)

Ray*_*ger 12

root的答案是正确的,但你真的不需要lambda:

>>> def key_function(x):
        return len(x), str(x)

>>> sorted(['foo','bar','foobar','barbar'], key=key_function)
['bar', 'foo', 'barbar', 'foobar']
Run Code Online (Sandbox Code Playgroud)

另外,还有一种替代方法利用排序稳定性,允许您在多次传递中排序(首先使用辅助键):

>>> ls = ['foo','bar','foobar','barbar']
>>> ls.sort(key=str)                       # secondary key
>>> ls.sort(key=len)                       # primary key
Run Code Online (Sandbox Code Playgroud)

有关Python排序技术的详细教程,请参阅排序HOWTO.

  • 好吧,我想说这里不需要一个完整的功能:)(顺便说一句,你有一个缺失的`,key = key_function)`) (9认同)
  • 当面对初学者问题时,我通常不会在答案中使用*lambda*而是使用最简单的答案.如果有人问这个关于排序和关键功能的问题,那么它表明他们不熟悉*lambda*. (3认同)