嵌套列表Python 3中的数字平方

时间:2017-08-01 23:49:19

标签: python recursion nested-lists

我必须解决的问题是将嵌套列表作为输入,并返回相同的嵌套列表,除了每个元素是以前存在于该点中的元素的平方。这是我的代码

>>> def treemap(lst):
...     for element in lst:
...         if element == type(list):
...             return treemap(element)
...         else:
...             element=element**2
...     return lst
>>> lst = [1, 2, 3, [4, [5, 6], 7]]
>>> print(treemap(lst))

现在我收到的错误是' int'对象不可迭代。我假设这意味着它试图为整数类型运行循环,这对我没有意义,因为我只重新运行列表类型的函数。

6 个答案:

答案 0 :(得分:6)

  1. 在递归调用中不要return,一旦返回,您将停止处理所有剩余元素

  2. element == type(list)不正确,因为type(list)<class 'type'>,它永远不会等于列表中的任何项目。请改用isinstance

  3. 在基本情况下,您需要按索引访问元素以反映更改

  4. def treemap(lst):
        for i, element in enumerate(lst):
            if isinstance(element, list):
                treemap(element)
            else:
                lst[i] = lst[i]**2
        return lst
    

    输出:

    [1, 4, 9, [16, [25, 36], 49]]
    

答案 1 :(得分:2)

此解决方案使用递归的三元列表推导生成 new 列表,如果项n是可迭代的,则会自行递归,否则返回其正方形。

def square_list(lst):
    return [square_list(n) if hasattr(n, '__iter__') else n ** 2 for n in lst]

>>> square_list(lst)
[1, 4, 9, [16, [25, 36], 49]]

修改

这是三元列表理解:

[a if condition(x) else b for x in some_iterable]

# Where condition(x) returns True if condition with argument `x` is True, otherwise False.

条件列表理解:

[x for x in some_iterable if condition]

答案 2 :(得分:1)

您需要使用isinstance()来检查type,如果该元素是列表而不是返回treemap(element),您可以将a[i]分配给treemap(element)它将以递归方式运行,直到处理完所有元素。例如:

def treemap(lst):
    for i, element in enumerate(lst):
        if isinstance(element, list):
            lst[i] = treemap(element)
        else:
            lst[i] = element ** 2
    return lst

lst=[1 ,2 , 3, [ 4, [ 5, 6 ], 7 ] ]
print(treemap(lst))

输出:

[1, 4, 9, [16, [25, 36], 49]]

答案 3 :(得分:1)

使用单一列表理解的解决方案:

>>> lst = [1, 2, 3, [4, [5, 6], 7]]
>>> [(lambda f, x: f(f, x))(lambda g, x: [g(g, y) for y in x] if isinstance(x, list) else x ** 2, el) for el in lst]
[1, 4, 9, [16, [25, 36], 49]]

并非我建议任何人在正常情况下使用此功能。

答案 4 :(得分:0)

为了尽可能接近我的代码,使用每个人的建议,这是我的答案:

  

1)1 == type(int)为False,正确的方法是type(1)== int

     

2)更改元素的值不会更改列表,所以我需要       参考lst的索引并改变其值

     

3)我不应该返回递归函数,而只是调用它。回报       语句将值传递回当前的直接调用者       函数的调用框架,这不是我想要的。

因此,我的最终答案是这个,

>>> def treemap(lst):
...     for i in range(len(lst)):
...         if type(lst[i])==int:
...             lst[i]=lst[i]**2
...         elif type(lst[i])==list:
...             treemap(lst[i])
...     return lst
>>> lst = [1, 2, 3, [4, [5, 6], 7]]
>>> print(treemap(lst))
[1, 4, 9, [16, [25, 36], 49]]

答案 5 :(得分:0)

有答案提供了in_place更改lst的解决方案,我将提供一个返回原始列表副本的解决方案。

def treemap(lst):
    cp = list()
    for element in lst:
        if isinstance(element, list):
            cp.append(treemap(element))
        else:
            cp.append(element**2)
    return cp