有两个条件的排序列表

时间:2019-06-18 14:45:51

标签: python python-3.x list sorting

我有一个要排序的字符串列表。但是,有些字符串是一个单词,另一些字符串是两个单词。另外,我想先按第二个单词排序,然后按第一个单词排序。

我对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()方法中工作。

3 个答案:

答案 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()])))