如何在python sorted(list)中指定2个键



如何通过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

我需要得到:

bar
foo
barbar
foobar

定义一个key函数,返回一个元组,其中第一项是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']

得到的答案是正确的,但是你真的不需要一个lambda:

>>> def key_function(x):
        return len(x), str(x)
>>> sorted(['foo','bar','foobar','barbar'], key=key_function)
['bar', 'foo', 'barbar', 'foobar']

此外,还有一种利用排序稳定性的替代方法,它允许您进行多次排序(首先使用副键):

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

请参阅排序HOWTO以获得关于Python排序技术的优秀教程。

如果你不想使用lambda:

from operator import itemgetter
ls = ['foo','bar','foobar','barbar']
print sorted([ [x,len(x)] for x in ls ] ,key=itemgetter(1,0))
# print [s[0] for s in sorted([ [x,len(x)] for x in ls ] ,key=itemgetter(1,0))]

另一个没有lambda的表单:

>>> [t[1] for t in sorted((len(s),s) for s in ls)]
['bar', 'foo', 'barbar', 'foobar']

最新更新