首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在python排序(List)中指定2个key?

如何在python排序(List)中指定2个key?
EN

Stack Overflow用户
提问于 2013-05-13 14:06:01
回答 3查看 1.3K关注 0票数 17

如何先按key=len排序字符串列表,再按key=str排序?我尝试了以下方法,但没有给出所需的排序结果:

代码语言:javascript
复制
>>> 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

我需要得到:

代码语言:javascript
复制
bar
foo
barbar
foobar
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-13 14:08:22

定义一个键函数,该函数返回一个元组,其中第一项为len(str),第二项为字符串本身。然后按字典顺序比较元组。也就是说,首先比较长度;如果长度相等,则比较字符串。

代码语言:javascript
复制
In [1]: ls = ['foo','bar','foobar','barbar']

In [2]: sorted(ls, key=lambda s: (len(s), s))
Out[2]: ['bar', 'foo', 'barbar', 'foobar']
票数 27
EN

Stack Overflow用户

发布于 2013-05-13 14:20:30

如果您不想使用lambda:

代码语言:javascript
复制
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))]
票数 2
EN

Stack Overflow用户

发布于 2013-05-13 14:28:09

另一个不使用lambda的表单:

代码语言:javascript
复制
>>> [t[1] for t in sorted((len(s),s) for s in ls)]
['bar', 'foo', 'barbar', 'foobar']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16515737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档