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

时间:2013-05-13 06:06:01

标签: python list sorting key

如何先按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

我需要得到:

{{1}}

4 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分: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

答案 2 :(得分: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))]

答案 3 :(得分:0)

另一种没有lambda的形式:

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