我在期中考试中没有回答这个问题。我不是要求你们为我做作业。只是想知道如何解决这个问题。我只知道如何使用列表索引来解决这个问题,但是这里不允许这个解决方案,因为问题已经说过我必须在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:
答案 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]