Python 如何对嵌套列表的所有级别进行排序?

Python 如何对嵌套列表的所有级别进行排序?,python,Python,我有一个表,我想将其转换为缩进的大纲文档,使用“depth”列作为缩进值,“pos”列作为每个元素在其层次结构级别中的相对位置 那么这个, 转换为: 我能够将该表解析为python字典: d = { 223:{'name':'fruit', 'pos':'1', 634:{'name':'apple', 'pos':'1', 945:{'name':'red','pos':'2'}, 306:{'name':'round','pos':'1'},

我有一个表,我想将其转换为缩进的大纲文档,使用“depth”列作为缩进值,“pos”列作为每个元素在其层次结构级别中的相对位置

那么这个,

转换为:

我能够将该表解析为python字典:

d = {
223:{'name':'fruit', 'pos':'1',
    634:{'name':'apple', 'pos':'1',
        945:{'name':'red','pos':'2'},
        306:{'name':'round','pos':'1'},
        847:{'name':'sweet','pos':'3'},
        },
    835:{'name':'banana', 'pos':'3',
        751:{'name':'long','pos':'1'},
        607:{'name':'yellow','pos':'2'},
        },
    515:{'name':'orange', 'pos':'2',
        397:{'name':'orange','pos':'2'},
        248:{'name':'round','pos':'1'},
        },
    }
}
如果列表或字典不是嵌套的,我知道如何排序:

d = {
223:{'name':'apple', 'pos':'1'},
945:{'name':'banana','pos':'3'},
847:{'name':'orange','pos':'2'},
}

sort = sorted(d.keys(), key=lambda x: (d[x]['pos']))

但我所困惑的是如何循环嵌套的级别并在每个级别上进行排序。

首先,在同一级别上有字符串和列表。Python不允许您比较这些:

>>> 'abc' < [1]
TypeError: '<' not supported between instances of 'str' and 'list'
有点粗糙,但它是有效的,因为您还没有指定如何处理它,所以我将使用该键函数

对于您的实际答案,您需要添加到该关键函数,以便对2元素列表使用
int(lst[1])
,或者类似的东西(您不完全清楚如何区分“特殊”列表和普通嵌套列表),但我将留给您去做


现在,我们只需要递归排序


如果您想就地进行排序,只需对列表进行排序,然后,对于每个元素,如果它是一个列表,则对其进行嵌套排序。同样,您需要为那些2元素列表的特殊大小写添加一些规则,但我不确定您需要什么规则,所以您可以自己解决

你可能想改变事情,对每个可变序列进行排序,而不仅仅是列表,或者……嗯,任何看起来合适的

def nested_sort(lst):
    lst.sort(key=lambda x: (type(x).__name__, x))
    for elem in lst:
        if isinstance(elem, list):
            nested_sort(elem)

如果您想要一个排序副本,那么递归就更容易了。同样,您必须为特例列表编写自己的代码,现在您有更多的类型选项可以作为嵌套处理(例如,除了字符串类型之外的所有序列?),但基本思想如下:

def nested_sorted(lst):
    if not isinstance(lst, list): return lst
    return sorted(map(nested_sorted, lst), 
                  key=lambda x: (type(x).__name__, x))

你有没有自己想出这个结构,或者你可以使用另一个?如果是这样的话,你能提供一些关于你提到的问题/目标和字典结构的背景信息吗?“我想排序”-你尝试了什么?什么不起作用?请发布您的代码和任何相关错误消息。您是如何按[2,1,4,1,2]顺序排列第二个嵌套列表的??第三个是[3,1,2],这是您的自定义排序吗?首先,不要调用您的列表
list
;这隐藏了类型的名称,这比通常情况下更为重要,因为您可能希望在代码中使用instance(element,list)。你想怎样分类?默认情况下,Python将拒绝比较这些元素并引发
TypeError
。在实现之前,您需要制定一条规则(比如“将所有字符串放在所有列表之前”)。
def nested_sorted(lst):
    if not isinstance(lst, list): return lst
    return sorted(map(nested_sorted, lst), 
                  key=lambda x: (type(x).__name__, x))