关于迭代嵌套列表有很多问题,但是我想迭代嵌套列表并应用另一个列表。
以下是我的情景:
def operation(a, b):
return a + b
def magic_function(func, list, nested_list):
"""iterate over nested_list and apply the next element of list"""
...
magic_function(operation, [0, 0, 0, 10, 10, 10], [[1, 2, 3], [1, 2, 3]])
期望的输出:
[[1, 2, 3], [11, 12, 13]]
用numpy回答这个问题的冲动可能很强烈,但在实际情况中,这些是对象,而不是数字。
标准itertools.chain.from_iterable
在这里不起作用,因为它不保留列表的嵌套。
答案 0 :(得分:5)
这是一个适用于任意深度嵌套列表的实现:
def nested_map(f, obj):
if isinstance(obj, list):
return [nested_map(f, item) for item in obj]
else:
return f(obj)
def magic_function(func, seq, nested_list):
g = iter(seq)
return nested_map(lambda item: func(item, next(g)), nested_list)
def operation(a, b):
return a + b
result = magic_function(operation, [0, 0, 0, 10, 10, 10], [[1, 2, 3], [1, 2, [[3]]]])
print(result)
结果:
[[1, 2, 3], [11, 12, [[13]]]]
答案 1 :(得分:4)
您可以使用itertools.count
索引您的公寓列表:
from itertools import count
def operation(a, b):
return a + b
def foo(func, lst, nested_list):
idx = count()
res = [[operation(j, lst[next(idx)]) for j in i] for i in nested_list]
return res
res = foo(operation, [0, 0, 0, 10, 10, 10], [[1, 2, 3], [1, 2, 3]])
print(res)
[[1, 2, 3], [11, 12, 13]]
或者您可以直接迭代平面列表:
def foo(func, lst, nested_list):
k = iter(lst)
res = [[operation(j, next(k)) for j in i] for i in nested_list]
return res