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

pro*_*eek 95 python sorting list

我想根据字符串长度对字符串列表进行排序.我尝试使用如下排序,但它似乎没有给我正确的结果.

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']
Run Code Online (Sandbox Code Playgroud)

可能有什么问题?

Eli*_*ght 177

传递给lambdato时sort,需要返回一个整数,而不是布尔值.所以你的代码应该如下所示:

xs.sort(lambda x,y: cmp(len(x), len(y)))
Run Code Online (Sandbox Code Playgroud)

注意,CMP是一个内置函数,使得cmp(x, y)返回-1,如果x小于y,0,如果x等于y,和1,如果x是大于y.

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

xs.sort(key = lambda s: len(s))
Run Code Online (Sandbox Code Playgroud)

这告诉sort方法根据键函数返回的顺序进行排序.

编辑:感谢下面的balpha和Ruslan指出你可以len直接作为关键参数传递给函数,因此不需要lambda:

xs.sort(key = len)
Run Code Online (Sandbox Code Playgroud)

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

print sorted(xs, key=len)
Run Code Online (Sandbox Code Playgroud)

  • 不需要`lambda`; 只需使用`key = len` (30认同)
  • 这将按升序排序(顶部字数较小)排序,按降序排序(底部字数较小)添加参数**reverse = True** (11认同)
  • 带有`key`参数的解决方案的+1. (3认同)
  • `xs.sort()` 抛出“TypeError:sort() 不接受位置参数”。相反,它应该是 `xs.sort(key=lambda x: len(x))` (2认同)

Rus*_*vak 83

与Eli的答案相同 - 只是使用较短的形式,因为你可以lambda在这里跳过一个部分.

创建新列表:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']
Run Code Online (Sandbox Code Playgroud)

就地排序:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
Run Code Online (Sandbox Code Playgroud)

  • `xs.sort(key = len,reverse = True)` (6认同)
  • 如何反转长度排序? (5认同)

小智 9

最简单的方法是:

list.sort(key = lambda x:len(x))


Jam*_*pam 5

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

装饰-排序-非装饰设计模式:

当使用所谓的decorate-sort-undecorate设计模式实现排序时,Python对关键功能的支持。

它分3个步骤进行:

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

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

  3. 装饰元素将替换为原始元素。

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