将操作和列表应用于嵌套列表

时间:2018-05-08 13:05:16

标签: python list multidimensional-array functional-programming iterator

关于迭代嵌套列表有很多问题,但是我想迭代嵌套列表并应用另一个列表。

以下是我的情景:

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在这里不起作用,因为它不保留列表的嵌套。

2 个答案:

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