【问题标题】:One liner function for sorting a string list of lists in ascending, descending order based on varying criteria in python一个线性函数,用于根据 python 中的不同标准按升序、降序对列表的字符串列表进行排序
【发布时间】:2017-05-17 02:10:34
【问题描述】:

假设我有以下列表:

[[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]))

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

【问题讨论】:

    标签: python string list sorting


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 我认为您的__lt__ 不正确。它说('b', 'b', 'a', 'b', 'b') &lt; ('a', 'b', 'b', 'b', 'b')。它应该只在前一个位置相等时才考虑下一个位置。
    【解决方案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)
    

    【讨论】:

    • 为了有机会在一条线上安装这种单线,您可以使用itemgetter(0, 2, 4)itemgetter(1, 3)。当然,请注意所有的复制。
    猜你喜欢
    • 2012-04-03
    • 2014-06-13
    • 2016-10-18
    • 2021-12-19
    • 1970-01-01
    • 2020-06-28
    • 2018-03-24
    • 2018-12-27
    相关资源
    最近更新 更多