2024-05-23 14:42:56 发布
网友
我想根据字符串长度对字符串列表进行排序。我试着用下面的排序,但似乎没有给出正确的结果。
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']
怎么了?
我想添加pythonic key函数在排序时的工作方式:
装饰-分类-未装饰设计图案:
Python在使用 装饰类非装饰设计图案。
分三步进行:
列表中的每个元素都暂时替换为一个“修饰”版本,该版本包含应用于该元素的键函数的结果。
列表根据键的自然顺序进行排序。
装饰元素被原始元素替换。
键参数,指定在进行比较之前要在每个列表元素上调用的函数。docs
当把lambda传递给sort时,需要返回一个整数,而不是布尔值。因此,您的代码应该改为如下所示:
lambda
sort
xs.sort(lambda x,y: cmp(len(x), len(y)))
注意cmp是一个内置函数,如果x小于y,则cmp(x, y)返回-1;如果x等于y,则返回0;如果x大于y,则返回1。
x
y
cmp(x, y)
当然,您可以使用key参数:
key
xs.sort(key = lambda s: len(s))
这告诉sort方法根据键函数返回的任何内容进行排序。
编辑:感谢下面的balpha和Ruslan指出,您可以直接将len作为关键参数传递给函数,从而消除了对lambda的需要:
len
xs.sort(key = len)
正如Ruslan在下面指出的,您还可以使用内置的sorted函数,而不是list.sort方法,该方法创建一个新列表,而不是对现有列表进行就地排序:
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']
我想添加pythonic key函数在排序时的工作方式:
装饰-分类-未装饰设计图案:
Python在使用 装饰类非装饰设计图案。
分三步进行:
列表中的每个元素都暂时替换为一个“修饰”版本,该版本包含应用于该元素的键函数的结果。
列表根据键的自然顺序进行排序。
装饰元素被原始元素替换。
键参数,指定在进行比较之前要在每个列表元素上调用的函数。docs
当把
lambda
传递给sort
时,需要返回一个整数,而不是布尔值。因此,您的代码应该改为如下所示:注意cmp是一个内置函数,如果
x
小于y
,则cmp(x, y)
返回-1;如果x
等于y
,则返回0;如果x
大于y
,则返回1。当然,您可以使用
key
参数:这告诉
sort
方法根据键函数返回的任何内容进行排序。编辑:感谢下面的balpha和Ruslan指出,您可以直接将
len
作为关键参数传递给函数,从而消除了对lambda
的需要:正如Ruslan在下面指出的,您还可以使用内置的sorted函数,而不是
list.sort
方法,该方法创建一个新列表,而不是对现有列表进行就地排序:与Eli的回答一样-只是使用一个较短的形式,因为您可以跳过这里的
lambda
部分。创建新列表:
就地分拣:
相关问题 更多 >
编程相关推荐