#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]
или eventmap(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]]