Как создать функцию Python, которая работает с двумя или более вложенными списками одинаковой формы?

#python #list

#python #Список

Вопрос:

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

 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)»)

Комментарии:

1. Будут ли списки вложенными только на один уровень глубиной?

2. @PeterCollingridge Да, по крайней мере, на этапе ввода (возможно, выходные данные могут быть вложены глубже в зависимости от применяемой функции)

3. Если списки вложены на один уровень вглубь, почему бы и нет, [func(val) for val in list_of_lists] или event map(func, list_of_lists) , это упростило бы вашу функцию.

Ответ №1:

Как насчет:

 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)
  

Ответ №2:

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

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