根据string的长度对Python列表进行sorting

我想根据string长度对string列表进行sorting。 我试图使用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'] 

什么可能是错的?

当你传递一个lambda进行sort ,你需要返回一个整数,而不是布尔值。 所以你的代码应该改为:

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

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

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

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

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

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

 xs.sort(key = len) 

正如Ruslan指出的那样,您还可以使用内置的sorting函数,而不是使用list.sort方法,该方法会创build一个新列表,而不是对现有sorting进行sorting:

 print sorted(xs, key=len) 

和Eli的答案一样 – 只是用一个简短的forms,因为你可以在这里跳过一个lambda部分。

创build新的列表:

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

就地分拣:

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

我想添加如何pythonic键function工作时sorting:

装饰 – 分类 – 不装饰devise模式:

当使用所谓的decorate-sort-undecoratedevise模式来实现sorting时,Python对关键函数的支持。

它分三步进行:

  1. 列表中的每个元素都暂时replace为“装饰”版本,其中包括应用于元素的键function的结果。

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

  3. 装饰元素被原始元素所取代。

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

编写一个函数lensort来根据长度对string列表进行sorting。

 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"]) 

最简单的方法是:

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

 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 

这对我有用!