我如何对多维列表进行排序?

how can i sort a list of Multidimension?

在学习使用键参数(Lamda x: x)进行排序时,我有一个问题。

我明白了,我可以使用key参数来判断对齐条件。如下所示。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(sorted(list1, key=lambda x: -x))
>> [9, 8, 7, 6, 5, 4, 3, 2, 1]

我也知道在双括号列表中是可能的。

list2 = [[1,9], [2,8], [3,7], [4,6], [5,5], [6,4]]

print(sorted(list2, key=lambda x: x[1]))
>> [[6, 4], [5, 5], [4, 6], [3, 7], [2, 8], [1, 9]]

我很好奇的是,我可以在三括号列表中设置对齐条件吗?
例如,如何按第三个元素的升序对下面的列表进行排序?

list3 = [[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]], [[5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 1]]]
# possible to sort it like below? in order of third element of Triple square brackets
>> [[[8, 9, 1], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]], [[5, 6, 7], [6, 7, 8], [7, 8, 9]]]

此外,是否可以对包含无括号、双括号和三括号元素的列表进行排序?

list4 = [ 5, 1, 3, [ [[4],[5]], [6] ], [1,2,3], [1,[2,3]]]
>> [ 5, 1, 3, [1,2,3], [1,[2,3]], [ [[4],[5]], [6] ]] # The order is from the lower list.

当您在列表中 运行 sort() 时,您所做的只是对该列表顶层的 元素进行排序.

list3 中,顶层的元素本身就是列表的列表。

list3 = [
          [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]],
          [[5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 1]]
        ]

您可以通过调用 sorted(list3, key=...) 翻转这两行,但您不能更改这些行中列表的顺序。为此,您还必须遍历 list3sort() 中的每个列表。

请记住,sort() 不会混淆列表的元素,因此无法调用排序并将 [8, 9, 1] 元素从第二行移动到第一行。


Also, is it possible to sort lists contain element with no brackets, double brackets, and triple brackets?

是的,只要你能提供一个 key 函数,它可以获取所有顶级列表元素和 return 给出排序顺序的东西:

list4 = [
           5, 
           1, 
           3, 
           [[[4], [5]], [6]], 
           [1, 2, 3], 
           [1, [2, 3]]
        ]

您的 key 函数需要能够将上面每一行中的任何值作为输入。例如,如果您要说排序顺序由该元素中的最大数字给出,而不管它有多深,您可以这样做:

# Given a multidimensional list, flatten it into a single dimension
def flatten_list(lst):
    flat_list = []
    for element in lst:
        if isinstance(element, list):
            flat_list.extend(flatten_list(element))
        else:
            flat_list.append(element) 
    return flat_list


def flattened_sort_order(item):
    # If the item is a list, return the max() of the flattened list
    if isinstance(item, list):
        return max(flatten_list(item))
    # Otherwise return the item itself
    else:
        return item

现在,sorted(list4, key=flattened_sort_order) 得到 [1, 3, [1, 2, 3], [1, [2, 3]], 5, [[[4], [5]], [6]]]