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

我想根据字符串长度对字符串列表进行排序。我尝试按照下面的方式使用 sort,但它似乎没有给出正确的结果。

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']

有什么问题吗?

153104 次浏览

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

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

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

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

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

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

编辑: 感谢下面的巴尔法和鲁斯兰指出,您可以直接传递 len作为函数的关键参数,从而消除了对 lambda的需要:

xs.sort(key=len)

正如 Ruslan 在下面指出的,你也可以使用内置的 解决了函数,而不是使用 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']

我想添加 Python 键函数在排序时的工作原理:

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

实现排序时 Python 对键函数的支持 装饰-分类-非装饰图案。

它分为三个步骤:

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

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

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

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

编写一个函数 lensort 来根据长度对字符串列表进行排序。

def lensort(a):
n = len(a)
for i in range(n):
for j in range(i+1,n):
if len(a[i]) > len(a[j]):
temp = a[i]
a[i] = a[j]
a[j] = temp
return a
print lensort(["hello","bye","good"])
def lensort(list_1):
list_2=[];list_3=[]
for i in list_1:
list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
list_3.append(i[0])
return list_3

这对我有用!

最简单的方法是:

Sort (key = lambda x: len (x))

我可以使用下面的两种方法,使用函数

def lensort(x):
list1 = []
for i in x:
list1.append([len(i),i])
return sorted(list1)


lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])

在一个使用 Lambda 的 Liner 中,如下所示,上面已经回答了一个问题。

 lista = ['a', 'bb', 'ccc', 'dddd']
lista.sort(key = lambda x:len(x))
print(lista)