Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个线性函数,用于根据python中的不同条件,按升序和降序对列表的字符串列表进行排序_Python_String_List_Sorting - Fatal编程技术网

一个线性函数,用于根据python中的不同条件,按升序和降序对列表的字符串列表进行排序

一个线性函数,用于根据python中的不同条件,按升序和降序对列表的字符串列表进行排序,python,string,list,sorting,Python,String,List,Sorting,假设我有以下列表: [[list1], [list2], ..., [listK]] 其中,list1、list2、…、listK是N个字符串的列表 [list1] = [string11, string12, ..., string1N] [list2] = [string21, string22, ..., string2N] . . . . . . 现在,让我们假设我想选择一些特定

假设我有以下列表:

[[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]))
但是因为我们有一个条件:第一个、第三个、第五个字符串按升序排列,然后第二个和第四个字符串按降序排列,我想知道上面的代码是否有一个简单的加法,使其成为一个单行解决方案。

排序只是
。排序已经就绪。因此,如果您坚持使用一行,您可以使用排序后的
执行类似操作:

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

我认为你的
不对。上面写着
('b','b','a','b','b')<('a','b','b','b')
。在前一个相等的情况下,只考虑下一个位置。如果有一个适合于一行的一个线性拟合,可以使用<代码> ITEMGETER(0, 2, 4)和<代码> ITEMGETER(1, 3)。当然要注意所有的复制。
outer_list.sort(key=MyOrdering)