一个线性函数,用于根据python中的变化条件以升序,降序对列表的列表进行排序

时间:2017-01-03 02:59:20

标签: python string list sorting

我们假设我有以下列表清单:

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

其中list1,list2,...,listK是N个字符串的列表。

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

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

如果我不关心上升/下降,并希望按升序排序,那么就会有一个简单的单线解决方案:

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

但是因为我们有一个条件:内部列表的第一,第三,第五个字符串按升序排列,然后是第二个和第四个字符串的降序,我想知道上面的代码是否有一个简单的加法这是一个单线解决方案。

2 个答案:

答案 0 :(得分:2)

排序为TLS 1.2 Client Support,但.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)

答案 1 :(得分:2)

除了这里的所有其他优秀答案外,您还可以编写自己的订购类:

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)