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

时间:2010-04-06 18:45:00

标签: python list sorting

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

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

可能出现什么问题?

7 个答案:

答案 0 :(得分:165)

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

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

请注意,cmp是内置函数,cmp(x, y)如果x小于y则返回-1,如果x等于{0则返回0 {1}},如果y大于x,则为1。

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

key

这告诉xs.sort(key = lambda s: len(s)) 方法根据键函数返回的顺序进行排序。

编辑:感谢下面的balpha和Ruslan指出你可以直接将sort作为关键参数传递给函数,从而无需len

lambda

正如Ruslan在下面指出的那样,你也可以使用内置的sorted函数而不是xs.sort(key = len) 方法,它创建一个新的列表,而不是对现有的列表进行排序:< / p>

list.sort

答案 1 :(得分:77)

与Eli的答案相同 - 只使用较短的表格,因为您可以在此处跳过lambda部分。

创建新列表:

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

就地排序:

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

答案 2 :(得分:4)

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

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

Python在使用所谓的“排序”实现排序时对关键函数的支持 decorate-sort-undecorate设计模式。

分3步进行:

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

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

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

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

答案 3 :(得分:2)

最简单的方法是:

  

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

答案 4 :(得分:1)

编写一个函数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"])

答案 5 :(得分:0)

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

这对我有用!

答案 6 :(得分: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)