根据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对关键函数的支持。
它分三步进行:
-
列表中的每个元素都暂时replace为“装饰”版本,其中包括应用于元素的键function的结果。
-
该列表根据键的自然顺序sorting。
-
装饰元素被原始元素所取代。
用于指定在进行比较之前在每个列表元素上调用的函数的关键参数。 文档
编写一个函数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
这对我有用!