我有一个列表和一个函数:
t = [3, [1], [2, [1], [1]]]
f = lambda x: x**2
我想要这样的结果:
[9, [1], [4, [1], [1]]]
我尝试使用地图功能,但似乎无法正常工作
执行此操作时出现类型错误:
list(map(f, t))
答案 0 :(得分:7)
如果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))
答案 1 :(得分:5)
您可以使用递归函数和列表推导,如下所示:
<li>
<div class="title">A</div>
<div class="value">
<strong>{{subsystemFailure.a}}</strong>
</div>
<div>
</li>
演示:
def nested_pow(arr, p):
return [pow(i, p) if isinstance(i, int) else nested_pow(i, p) for i in arr]
答案 2 :(得分:5)
您可以编写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)
t = [3, [1], [2, [1], [1]]]
f = lambda x: x**2
print(list(recursive_map(f, t)))
# output: [9, [1], [4, [1], [1]]]
答案 3 :(得分:4)
您需要将函数更改为递归,以便它可以遍历任意深度的数据:
f = lambda x:x*x if not isinstance(x, list) else [f(i) for i in x]
t = [3, [1], [2, [1], [1]]]
new_result = list(map(f, t))
输出:
[9, [1], [4, [1], [1]]]