Как сделать функцию Python, которая работает с двумя или более вложенными списками одинаковой формы? - PullRequest
1 голос
/ 28 марта 2019

Я хотел бы применить произвольную функцию к двум или более вложенным спискам одинаковой формы. Например, если моя функция:

def add(a, b):
    if "NULL" not in [a, b]:
        return a + b
    else:
        return "NULL"

и мои входные данные:

input1 = [[1, 2, "NULL"], [3, 4], [5, 6, 7, 8]]
input2 = [[9, 8, "NULL"], [7, 6], [5, 4, 3, 2]]

Тогда я бы хотел, чтобы результат был

output = [[10, 10, "NULL"], [10, 10], [10, 10, 10, 10]]

Входные данные всегда будут вложены на один уровень глубиной, но в идеале выходные данные должны быть чем угодно (например, они могут быть вложены глубже, если функция была функцией "concatenate (a, b)")

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Как насчет:

def apply_f(a, b, f):
    if isinstance(a, list):
        return [apply_f(item_a, item_b, f) for item_a, item_b in zip(a, b)]
    else:
        return f(a, b)

result = apply_f(input1, input2, add)
0 голосов
/ 29 марта 2019

Предполагая, что списки всегда имеют правильную длину (вы можете поставить галочку для этого), сделайте вашу функцию рекурсивной:

def add(a, b):

    if isinstance(a, list) and isinstance(b, list):
        for a_sub, b_sub in zip(a, b):
            return [add(a_sub, b_sub) for a_sub, b_sub in zip(a, b)]

    elif "NULL" not in [a, b]:
        return a + b

    elif "NULL" in [a, b]:
        return "NULL"

    else:
        raise ValueError("Wrong input shapes")

input1 = [[1, 2, "NULL"], [3, 4], [5, 6, 7, 8]]
input2 = [[9, 8, "NULL"], [7, 6], [5, 4, 3, 2]]

add(input1, input2)

Вывод:

[[10, 10, 'NULL'], [10, 10], [10, 10, 10, 10]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...