根据字符串的长度对Python列表进行排序

2024-05-23 14:42:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想根据字符串长度对字符串列表进行排序。我试着用下面的排序,但似乎没有给出正确的结果。

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

怎么了?


Tags: lambda字符串列表len排序sortprintccc
3条回答

我想添加pythonic key函数在排序时的工作方式:

装饰-分类-未装饰设计图案:

Python在使用 装饰类非装饰设计图案。

分三步进行:

  1. 列表中的每个元素都暂时替换为一个“修饰”版本,该版本包含应用于该元素的键函数的结果。

  2. 列表根据键的自然顺序进行排序。

  3. 装饰元素被原始元素替换。

键参数,指定在进行比较之前要在每个列表元素上调用的函数。docs

当把lambda传递给sort时,需要返回一个整数,而不是布尔值。因此,您的代码应该改为如下所示:

xs.sort(lambda x,y: cmp(len(x), len(y)))

注意cmp是一个内置函数,如果x小于y,则cmp(x, y)返回-1;如果x等于y,则返回0;如果x大于y,则返回1。

当然,您可以使用key参数:

xs.sort(key = lambda s: len(s))

这告诉sort方法根据键函数返回的任何内容进行排序。

编辑:感谢下面的balpha和Ruslan指出,您可以直接将len作为关键参数传递给函数,从而消除了对lambda的需要:

xs.sort(key = len)

正如Ruslan在下面指出的,您还可以使用内置的sorted函数,而不是list.sort方法,该方法创建一个新列表,而不是对现有列表进行就地排序:

print sorted(xs, key=len)

与Eli的回答一样-只是使用一个较短的形式,因为您可以跳过这里的lambda部分。

创建新列表:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

就地分拣:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

相关问题 更多 >