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

2024-05-16 16:36:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以,这个:table

转换为:outline

我能够将表解析为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']))

但我困惑的是如何循环嵌套的级别并对每个级别进行排序。你知道吗


Tags: name文档pos元素apple字典层次结构排序
1条回答
网友
1楼 · 发布于 2024-05-16 16:36:18

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

>>> 'abc' < [1]
TypeError: '<' not supported between instances of 'str' and 'list'

如果你想用这些来做什么,你可以写一个key function来应用这个规则。例如,假设我们希望在字符串之前对列表进行排序。我们可以对每个元素x进行排序,就好像它是一对(type(x).__name__, x)

>>> ('str', 'abc') < ('list', [1])
False

有点不太靠谱,但它是有效的,既然您还没有指定如何处理这个问题,我就用那个键函数。你知道吗

对于您的实际答案,您需要添加到该键函数,以便对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))

相关问题 更多 >