我有一个要排序的字符串列表。但是,有些字符串是一个单词,另一些字符串是两个单词。另外,我想先按第二个单词排序,然后按第一个单词排序。
我对lambda函数以及key如何用于sort()方法还比较陌生,所以我尝试了以下方法(无效):
list_to_sort = ['1 month', '1 year', '3 months', '3 years', '6 months', 'daily']
def sort_func(x):
x.split()
if len(x) == 1:
return x[0]
else:
return x[1]
cols.sort(key=sort_func)
# I would like the output to be:
# ['daily', '1 month', '3 months', '6 months', '1 year', '3 years']
相反,列表完全不变。我不太确定“ key =“如何在sort()方法中工作。
答案 0 :(得分:2)
您快到了,x.split()
返回一个新列表,因此您需要将返回值分配给变量。另外,由于拆分后的一个字是浮点数,因此在创建键
list_to_sort = ['', '1 month', '1 year', '3 months', '3 years', '6 months', 'daily', '11 months', '12 years']
def sort_func(x):
#Assign result of split to li
li = x.split()
#If 1 element, return word, 0
if len(li) == 1:
return li[-1], 0
#If 2 elements, return word and number cast to int
elif len(li) == 2:
return li[-1], int(li[0])
#If no elements, return empty string and 0
else:
return '',0
list_to_sort.sort(key=sort_func)
print(list_to_sort)
输出将为
['', 'daily', '1 month', '3 months', '6 months', '11 months', '1 year', '3 years', '12 years']
答案 1 :(得分:1)
.split
不到位。 x.split()
创建一个列表并将其丢弃。
由于本质上是按最后一个单词排序(如果您有1个单词,那么“最后一个单词”就是那个1个单词),因此sort_func
的更好实现是
return x.split()[-1]
或作为lambda:
cols.sort(key=lambda x: x.split()[-1])
答案 2 :(得分:1)
这是另一种解决方案:
list_to_sort = ['1 month', '1 year', '3 months', '3 years', '6 months', 'daily']
list_to_sort = sorted(list_to_sort, key=lambda x: tuple(reversed(x.split())))
print(list_to_sort)
# >> ['daily', '1 month', '3 months', '6 months', '1 year', '3 years']
注意事项:无论字数为多少(包括空字符串),此方法都可以使用。
示例:
['', 'daily', '2 months 1 day', '3 months', '6 months', '1 year', '3 years']
更新:请记住,字符串中的数字将按字符而不是整数排序:
['1', '11', '2', ...]
如果要避免这种情况,应将上面的行更改为:
list_to_sort = sorted(list_to_sort, key=lambda x: tuple(reversed([float(item) if item.isnumeric() else item for item in x.split()])))