【问题标题】:How do I clean a Python list from extraneous nesting?如何从无关嵌套中清除 Python 列表?
【发布时间】:2020-01-04 16:58:55
【问题描述】:

我正在开发一个程序,其中我们有一个包含大量无关嵌套的特定列表,我们希望对其进行简化。

例如,一个输入可以是

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

它应该输出 ['A', ['B', ['C', [['D'], ['E'], ['F', ['G']], ['H'], ['I'], ['J']]]]]

但是,在运行我的代码后,它什么也没做并返回[]

这是我的代码:

def clean_list(list2):
    for item in list2:
        if isinstance(item, list) and len(list2)==1: # this is an extraneous list!
            item = clean_list(item)
            list2.append(item[0].copy())
            list2.remove(item)
    return list2

【问题讨论】:

标签: python arrays list recursion tree


【解决方案1】:

您可以使用一个函数递归地取消给定列表中的每个项目,但如果列表只有一个项目并且该项目是一个列表,则将子列表传递给递归调用:

def denest(lst):
    if isinstance(lst, list):
        if len(lst) == 1 and isinstance(lst[0], list):
            return denest(lst[0])
        return [denest(i) for i in lst]
    return lst

这样给定存储在变量lst 中的样本列表,denest(lst) 将返回:

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

【讨论】:

  • 我正在编写完全相同的代码(token-for-token,只是使用了更好的命名 ;-) )......很好,你比大量的“坏复制关闭”警察更快: -)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2011-07-14
  • 2021-08-21
相关资源
最近更新 更多