【问题标题】:Remove unnecessary layers from multi-demensional list python从多维列表python中删除不必要的层
【发布时间】:2020-01-30 19:19:07
【问题描述】:

我的计划是将具有未知层数的多维列表(即[["a"], [["b"], ["c"]]])的输入转换为["a", ["b", "c"]],但目前我的输出与原始输出相同,具有以下功能:

def extract(tree):
    for x in range(len(tree)):
        if type(tree[x]) == list:
            extract(tree[x])
        else:
            tree = tree[x]

基本上,我想删除数组中只有一个元素的所有不必要的层,

关于我做错了什么有什么想法吗?

感谢您的帮助

【问题讨论】:

  • tree = tree[x] 不会修改原始的 tree 对象,因此,您的函数永远不会修改它
  • 那些不是多维数组,它们根本不是数组。它们是list 对象
  • @juanpa.arrivillaga 已修复。抱歉用错了术语

标签: python arrays python-3.x multidimensional-array


【解决方案1】:

只需添加一些返回值,您的代码就可以正常工作。

def extract(tree):
    for x in range(len(tree)):
        if type(tree[x]) == list:
            tree[x] = extract(tree[x])
        else:
            return tree[x]

    return tree

# test cases
test = [["a"], [["b"], ["c"]]]
print(extract(test))

test = [["a"], [["b"], ["c"], [["b"], ["c"]]]]
print(extract(test))

【讨论】:

    【解决方案2】:

    可能是这样的:

    def tree(element):
      if isinstance(element, str):
        return element
      elif len(element) == 1:
        return element[0]
    
      unfolded = []
      for each in element:
        unfolded.append(tree(each))
      return unfolded
    
    a = [["a"], [["b"], ["c"]]]
    print(tree(a)) # => ['a', ['b', 'c']]
    
    

    【讨论】:

      【解决方案3】:
      1. 通常最好使用 isinstance() 而不是 type() 在代码中进行类型检查。

      不完全确定您要使用此代码完成什么。 Axe319 的答案将删除所有内部数组/列表并将[["a"], [["b"], ["c"]]]["a", ["b", "c"]] 作为['a','b','c'] 返回。如果您希望列出一个、两个、三个等(即[['a'], ['b', 'c'], ['d', 'e', 'f']...),则必须重新设计代码。

      【讨论】:

      • 不,axe 的回答完全符合预期。基本上,我想删除数组中只有一个元素的任何不必要的层
      • 啊,我明白了,是的,我添加退货的错误就像一个魅力
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      相关资源
      最近更新 更多