【问题标题】:How does putting the variable for empty list alter this python code?将变量放入空列表如何改变这个 python 代码?
【发布时间】:2016-06-19 15:36:40
【问题描述】:

我正在尝试编写代码来使用递归展平任何嵌套列表。这是我写的第一个代码:

def flatten(NL):
    a = []
    for i in NL:
        if type(i) == int:
            a.append(i)
        elif type(i) == list:
            flatten(i)
    return a

但是,它一直返回一个空列表,直到我更改代码并将变量“a”放在函数之外:

a = []
def flatten(NL):
    for i in NL:
        if type(i) == int:
            a.append(i)
        elif type(i) == list:
            flatten(i)
    return a

我试图将我的思想包裹在它身上,但无济于事。将空列表放在函数之外对其有何影响?

【问题讨论】:

    标签: python recursion flatten


    【解决方案1】:

    如果你打算使用递归,那么你也有一个 for 循环,有点“双重浸渍”。

    对于通过列表进行递归,对头部进行操作并在尾部进行递归。根本不需要声明你自己的列表,这只会让它变得更加困难。

    def flatten(NL):
        if type(NL) == list:
            if not NL:
                return NL    #empty list terminate recursion
            return flatten(NL[0]) + flatten(NL[1:])
        return [NL]     #'scalar' value terminate recursion
    

    这是一个例子

    >>> flatten([[1,2],[3,[4,5]],[6,7]])
    [1, 2, 3, 4, 5, 6, 7]
    

    【讨论】:

      【解决方案2】:

      当你把a放在函数外面时,你总是在修改同一个a,但是当你把它放在里面时,你每次都在重新定义a。由于您只是说flatten(i),而您实际上并没有对扁平化版本做任何事情,所以a 不受扁平化的影响。您需要将扁平化版本添加到a:

      def flatten(NL):
          a = []
          for i in NL:
              if type(i) == int:
                  a.append(i)
              elif type(i) == list:
                  a += flatten(i) # Here we add the flattened version to a instead of just creating it.
          return a
      

      【讨论】:

      • 非常感谢。阅读您的答案后,我做了一些阅读,发现我可以在每次递归调用时扩展 a 。 ` flatten(NL): a = [] for i in NL: if type(i) == int: a.append(i) elif type(i) == list: a.extend (flatten(i)) # 这里我们将扁平化版本添加到 a 而不是仅仅创建它。返回一个`
      • 是的。这绝对似乎是一个更好的解决方案。不过需要注意的一点是:您应该使用if isinstance(i, list): 而不是if type(i) == list:(与int 相同),以便list 的子类实例仍属于该类别。如果您觉得我的回答有用,请考虑将其标记为正确答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多