Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python排序(列表)中指定2个键?_Python_List_Sorting_Key - Fatal编程技术网

如何在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