递归以平方嵌套列表中的所有元素

时间:2017-02-11 20:38:08

标签: python

我在期中考试中没有回答这个问题。我不是要求你们为我做作业。只是想知道如何解决这个问题。我只知道如何使用列表索引来解决这个问题,但是这里不允许这个解决方案,因为问题已经说过我必须在nums中包含" for x"在功能中。我知道int是不可变的,所以我该怎么办?感谢" isinstance"的提示,但是我很抱歉我们之前没有学过它所以我不能在考试中使用它。

我刚刚学会了如何使用索引来解决类似的问题。我认为它可以像这样工作:

def square_all(nums):
    new = []
    for x in nums:
        new.append(x)
    for i in range(len(new)):
        if type(new[i]) != list:
            new[i] = new[i] ** 2
        else:
            square_all(new[i])
    return new

效果不好。我认为'其他'有问题。但是我应该如何修改?

  

编写一个python函数square_all,它接受​​一个参数,一个嵌套的整数列表,并返回一个新的嵌套整数列表,它在结构上与给定列表相同,但是其中所有整数都已经平方。注意,该函数不应修改其参数;它应该建立一个新的单独列表。

     

通过在循环内或循环内写下您认为需要的任何内容来完成该功能。不要在函数之外编写代码。假设您没有可用的全局变量。不要对已提供的代码进行更改。

     

示例:

square_all([1,2,[3,4]]) = [1,4,[9,16]]
     

给定代码:

def square_all(nums;'nested list of integers') -> 'nested list of integers':    
    for x in nums:

3 个答案:

答案 0 :(得分:2)

这是解决这个问题的一般方法:

def map_nested(fnc, obj):
    if isinstance(l, (list, set, tuple)):  # whatever collection type you want
        return type(obj)(map_nested(fnc, sub) for sub in obj)
    return fnc(obj)        

> map_nested(lambda x: x**2, [1, 2, (3, 4, set([5, 6]))])
[1, 4, (9, 16, set([25, 36]))]

答案 1 :(得分:0)

您可以创建递归函数:

def get_square(l):
    return [get_square(e) if isinstance(e, list) else e**2 for e in l]
    #                           ^ to check object is of `list` type

示例运行:

>>> get_square([1,2,[3,4]])
[1, 4, [9, 16]]

但是,此函数仅支持list作为嵌套对象。如果您将元组作为嵌套结构传递,它将失败。例如:

>>> get_square([1,2,(3,4)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in get_square
TypeError: unsupported operand type(s) for ** or pow(): 'tuple' and 'int'

如果您希望您的函数支持所有迭代,您应该isinstance检查collections.Iterable。因此你的功能应该是:

from collections import Iterable

def get_square(l):
    return type(l)(get_square(e) if isinstance(e, Iterable) else e**2 for e in l)
    #        ^                        ^ check for `collections.Iterable`
    #        ^ for preserving the type of `Iterables`

示例运行:

>>> get_square([1,2,(3,4)])
[1, 4, (9, 16)]

答案 2 :(得分:0)

您的代码存在的问题是您创建了列表,因此只需调用square_all(new[i])即可更改new[i]。您必须分配结果:new[i] = square_all(new[i])

def square_all(nums):
    new = []
    for x in nums:
        new.append(x)
    for i in range(len(new)):
        if type(new[i]) != list:
            new[i] = new[i] ** 2
        else:
            new[i] = square_all(new[i])  # assign result to new[i]
    return new

或者更短一些,直接附加最终值,而不是先使用原始值,然后再覆盖它们:

def square_all(nums):
    result = []
    for n in nums:
        if type(n) is list:
            result.append(square_all(n))
        else:
            result.append(n**2)
    return result

真的简短,使用列表解析中的给定代码:

def square_all(nums):
    return [square_all(n) if type(n) is list else n**2 for n in nums]