我有一个列表和一个功能:
t = [3, [1], [2, [1], [1]]]
f = lambda x: x**2
Run Code Online (Sandbox Code Playgroud)
我想要这样的结果:
[9, [1], [4, [1], [1]]]
Run Code Online (Sandbox Code Playgroud)
我试图使用地图功能,但似乎没有用
我这样做时出现类型错误:
list(map(f, t))
Run Code Online (Sandbox Code Playgroud)
如果元素t是另一个列表,则需要映射函数,而不是调用函数.如果您希望它处理任意级别的嵌套,则f需要递归.
t = [3, [1], [2, [1], [1]]]
def f(x):
if isinstance(x, list):
return map(f, x)
else:
return x**2
print(map(f, t))
Run Code Online (Sandbox Code Playgroud)
您可以使用递归函数和列表推导,如下所示:
def nested_pow(arr, p):
return [pow(i, p) if isinstance(i, int) else nested_pow(i, p) for i in arr]
Run Code Online (Sandbox Code Playgroud)
演示:
In [34]: nested_pow(t, 2)
Out[34]: [9, [1], [4, [1], [1]]]
In [35]: nested_power(t, 3)
Out[35]: [27, [1], [8, [1], [1]]]
In [36]: nested_power(t, 10)
Out[36]: [59049, [1], [1024, [1], [1]]]
Run Code Online (Sandbox Code Playgroud)
你可以写一个map函数的递归变体:
def recursive_map(func, iterable, *, sequence_types=(list,tuple)):
for value in iterable:
# if's a sequence, recurse
if isinstance(value, sequence_types):
cls = type(value)
values = recursive_map(func, value, sequence_types=sequence_types)
yield cls(values)
else: # if it's not a sequence, call the function on it
yield func(value)
Run Code Online (Sandbox Code Playgroud)
t = [3, [1], [2, [1], [1]]]
f = lambda x: x**2
print(list(recursive_map(f, t)))
# output: [9, [1], [4, [1], [1]]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |