簡體   English   中英

一個線性函數,用於根據python中的變化條件以升序,降序對列表的列表進行排序

[英]One liner function for sorting a string list of lists in ascending, descending order based on varying criteria in 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]))

但是因為我們有一個條件:內部列表的第一,第三,第五個字符串按升序排列,然后按第二個和第四個字符串按降序排列,我想知道是否有一個簡單的添加到上面的代碼使它成為一個襯墊解決方案

排序在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM