17

如何按key=lenfirst 然后 by对字符串列表进行排序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
4

4 回答 4

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']
于 2013-05-13T06:08:22.373 回答
12

来自root的答案是正确的,但你并不真的需要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

有关 Python 排序技术的优秀教程,请参阅Sorting HOWTO

于 2013-05-13T06:29:46.383 回答
2

如果您不想使用 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))]
于 2013-05-13T06:20:29.737 回答
0

没有 lambda 的另一种形式:

>>> [t[1] for t in sorted((len(s),s) for s in ls)]
['bar', 'foo', 'barbar', 'foobar']
于 2013-05-13T06:28:09.227 回答