如何在python排序(列表)中指定2个键?
如何先按如何在python排序(列表)中指定2个键?,python,list,sorting,key,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):
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
定义一个键函数,返回一个元组,其中第一项是
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:
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']
root给出的答案是正确的,但实际上并不需要lambda:
>>> [t[1] for t in sorted((len(s),s) for s in ls)]
['bar', 'foo', 'barbar', 'foobar']
此外,还有另一种方法利用排序稳定性,允许您在多个过程中进行排序(首先使用辅助键):
有关Python排序技术的良好教程,请参阅。如果性能重要,只需2c:独立函数应该比
lambda
@Eric-Duh快得多。。。在测试之后-我必须说,这真的没有任何性能差异。嗯,在测试之后,我撤销了我的评论,没有任何差异。这是我的一些偏见。这比lambda更丑陋,因为你在结果中引入了cruft,这需要额外的[0]
来访问结果,与lambda相比,它的执行时间也是x2,对我来说,key_函数的执行时间是lambda版本的1.2倍,所以你不需要使用DSUWell,我想说这里不需要一个完整的函数:)(顺便说一句,你有一个缺少的,key=key_函数)
)当面对初学者的问题时,我通常不会在答案中使用lambda,而是使用最简单的答案公式。如果有人问这个关于排序和关键函数的问题,那么这表明他们对lambda还不太满意。我想我读到它是因为在这种情况下使用lambdas应该在某种程度上被劝阻。
>>> ls = ['foo','bar','foobar','barbar']
>>> ls.sort(key=str) # secondary key
>>> ls.sort(key=len) # primary key