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

Che*_* Gu 2 python python-3.x

我有一个列表和一个功能:

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)

Bar*_*mar 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))
Run Code Online (Sandbox Code Playgroud)


Kas*_*mvd 5

您可以使用递归函数和列表推导,如下所示:

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)


Ara*_*Fey 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)
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)