按组和级别对多级嵌套列表进行排序

Sort multi level nested list in groups and by level

我有一个列表:

['A', 'B', 'C', ['D', ['E', 'F'], 'G'], 'H']

我想把它变成:

[['E', 'F'], ['D', 'G'], ['A', 'B', 'C', 'H']]

所以基本上我希望列表最深层的子列表在新列表中排在第一位,然后对剩余子列表的级别进行倒数。 这应该适用于任何嵌套列表。

如果同一级别有两个子列表,那么哪个先出现并不重要。

['A', 'B', 'C', ['D', ['E', 'F'], 'G'], ['H', 'I', 'J']]

[['E', 'F'], ['D', 'G'], ['H', 'I', 'J'], ['A', 'B', 'C', 'H']] #this is fine
[['E', 'F'], ['H', 'I', 'J'], ['D', 'G'], ['A', 'B', 'C', 'H']] #this too

我想首先使用一个函数来确定最深的子列表在哪个级别,但是我又不知道如何根据级别访问列表中的项目,或者这是否可能。

这个问题已经纠结太久了,我想我的脑袋快要放弃了,希望有人能帮我解决这个问题!

您可以使用递归生成器函数:

def sort_depth(d, c = 0):
  r = {0:[], 1:[]}
  for i in d:
     r[not isinstance(i, list)].append(i)
  yield from [i for j in r[0] for i in sort_depth(j, c+1)]
  yield (c, r[1])
 
def result(d):
   return [b for _, b in sorted(sort_depth(d), key=lambda x:x[0], reverse=True) if b]

print(result(['A', 'B', 'C', ['D', ['E', 'F'], 'G'], 'H']))
print(result(['A', 'B', 'C', ['D', ['E', 'F'], 'G'], ['H', 'I', 'J']]))
print(result([[1, [2]], [3, [4]]]))

输出:

[['E', 'F'], ['D', 'G'], ['A', 'B', 'C', 'H']]
[['E', 'F'], ['D', 'G'], ['H', 'I', 'J'], ['A', 'B', 'C']]
[[2], [4], [1], [3]]

这是一个相对直接的解决方案:

def sort_depth(d):
    def dlists(obj, dep=0):
        for x in filter(list.__instancecheck__, obj):
            yield from dlists(x, dep-1)
        yield [x for x in obj if not isinstance(x, list)], dep
    return [x for x, y in sorted(dlists(d), key=lambda p: p[1])]
        

>>> [*sort_depth([[1, [2]], [3, [4]]])]
[[2], [4], [1], [3], []]

>>> [*sort_depth(['A', 'B', 'C', ['D', ['E', 'F'], 'G'], 'H'])]
[['E', 'F'], ['D', 'G'], ['A', 'B', 'C', 'H']]

方法:

  1. 收集所有子列表并用它们的(负)嵌套级别对其进行注释,例如(['E', 'F'], -2)
  2. 按嵌套级别排序
  3. 从排序后的数据中提取列表