如何将函数应用于列表中的列表

时间:2018-05-03 19:48:00

标签: python python-3.x

我有一个列表和一个函数:

t = [3, [1], [2, [1], [1]]]

f = lambda x: x**2

我想要这样的结果:

[9, [1], [4, [1], [1]]]

我尝试使用地图功能,但似乎无法正常工作

执行此操作时出现类型错误:

list(map(f, t))

4 个答案:

答案 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]]]