Python中基于不同准则对字符串列表排序的一行代码函数(按升序或降序排列)

2024-06-26 01:33:09 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下列表:

[[list1], [list2], ..., [listK]]

其中list1、list2、…、listK是N个字符串的列表。你知道吗

 [list1] = [string11, string12, ..., string1N]
 [list2] = [string21, string22, ..., string2N]
    .              .
    .              .
    .              .

现在,假设我想选择内部列表的某个特定子集,按降序排序,其余的按升序排序。 例如,假设N=5,我首先要对外部列表进行排序,按内部列表的第一、第三、第五个字符串的升序排序,然后按第二、第四个字符串的降序排序。你知道吗

如果我不关心升序/降序,并且希望按升序对所有内容进行排序,那么会有一个简单的单行解决方案:

outer_list.sort(key = lambda lst: (lst[0], lst[2], lst[4], lst[1], lst[3]))

但是由于我们有一个条件:第一,第三,第五个字符串按升序排列,然后按第二,第四个字符串按降序排列,我想知道是否有一个简单的添加到上面的代码,使它成为一个单行解决方案。你知道吗


Tags: 字符串列表排序解决方案单行lstlist2升序
2条回答

排序是stable in python,但.sort已就位。所以,如果你坚持一行,你可以用sorted做这样的事情:

outer_list = sorted(sorted(outer_list, key=lambda x: (x[0], x[2], x[4])), key=lambda x: (x[1], x[3]), reverse=True)

除了这里所有其他的好答案之外,您还可以编写自己的排序类:

from functools import total_ordering

@total_ordering
class MyOrdering(object):
    def __init__(self, value):
        self.value = value
    def __eq__(self, other):
        return other.value == self.value
    def __lt__(self, other):
        for i in [0, 2, 4]:
            if self.value[i] != other.value[i]:
                return self.value[i] < other.value[i]
        for i in [1, 3]:
            if self.value[i] != other.value[i]:
                return self.value[i] > other.value[i]
        return False

然后可以使用MyOrdering类作为键函数进行排序:

outer_list.sort(key=MyOrdering)

相关问题 更多 >