基于字符串长度对Python列表进行排序

163

我想根据字符串长度对字符串列表进行排序。尝试使用以下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']

可能出了什么问题?

8个回答

262

当你将一个 lambda 传递给 sort 函数时,需要返回一个整数而不是布尔值。因此,你的代码应该改为以下内容:

xs.sort(lambda x,y: cmp(len(x), len(y)))
请注意,cmp是一个内置函数,使得cmp(x, y)返回-1如果x小于y,返回0如果x等于y,返回1如果x大于y。当然,你也可以使用key参数:
xs.sort(key=lambda s: len(s))

这将告诉sort方法基于键函数返回的内容进行排序。

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

xs.sort(key=len)

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

print(sorted(xs, key=len))

47
不需要使用 lambda,只需使用 key = len - balpha
20
这将按升序排列(单词长度较短的在顶部),要按降序排列(单词长度较短的在底部),请添加参数 reverse=True - Ajay Gupta
1
xs.sort() 抛出 "TypeError: sort() takes no positional arguments"。应该使用 xs.sort(key=lambda x: len(x)) - Hi-Angel

116
与Eli的答案相同-只是使用了更短的形式,因为你可以在这里跳过 lambda 部分。
创建新列表:
>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

原地排序:

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

6
如何按长度反向排序? - user2922935
1
@user2922935:你可以使用xs[::-1]来反转已经排序的列表。 在这里查看Dan Bader的文章:https://dbader.org/blog/python-reverse-list - Thyag
19
xs.sort(key=len, reverse=True) - Raz

9
最简单的方法是:

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

其中,lambda函数是按照列表中每个元素的长度进行排序。

5
我想解释一下Python中关于排序的键函数的工作原理:
装饰-排序-去装饰设计模式:
在排序时,Python支持使用键函数的方式是通过实现所谓的“装饰-排序-去装饰”设计模式来完成的。
它分为三个步骤:
1. 暂时用包括应用于元素的键函数结果的“装饰”版本替换列表的每个元素。 2. 根据键的自然顺序对列表进行排序。 3. 用原始元素替换已装饰的元素。
Key参数用于指定在进行比较之前要调用的每个列表元素的函数。 docs

2
编写一个名为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"])

0
我可以使用以下两种方法来实现,使用函数。
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表达式的一行代码,如下所示,已经在之前回答过了。

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

-1
def swap_pos(lst):
    for i in range(len(lst)):
        for j in range(0, i):
            if len(lst[j]) < len(lst[i]):
                lst.insert(j, lst[i])
                lst.pop(i + 1)
                break

    print(lst)

swap_pos(technology)

2
请不要发布仅包含代码的答案;相反,请解释您的答案为何有效。有关如何编写良好答案的更多信息,请参见[答案]。 - Sylvester Kruin

-1
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

这个对我来说可行!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接