Как заменить все значения в массиве на 0, если не известна структура?

Дан массив, структура которого неизвестна например a = [1, 34 ,2, 4] или a = [1, [2, 4]].

Нужно заменит все значения в массиве на одинаковое, чтобы по итогу получить a = [0, 0 ,0, 0] или a = [0, [0, 0]] соответственно. В интернете пишут про метод Numpy, но он не может работать с двумерными массивами.


Ответы (2 шт):

Автор решения: Кирилл Малышев

Используйте рекурсию.

def set_zeros(l):
    for i in range(len(l)):
        if isinstance(l[i], list):
            l[i] = set_zeros(l[i])
        else:
            l[i] = 0
    return l


def set_zeros_copy(l):
    res = []
    for i in range(len(l)):
        if isinstance(l[i], list):
            res.append(set_zeros_copy(l[i]))
        else:
            res.append(0)
    return res

Первая функция модифицирует содержимое исходного массима, а вторая создаёт копию.

→ Ссылка
Автор решения: edem

Нужно использовать вызов, который вызывает самого себя для случая, если значение из набора является ссылкой на другой набор. На перл это можно сделать примерно так:

use strict;
use warnings;

use Data::Dumper;

my $a=[1, 2, [3,4], 5, [6, [7, [8,9] ] ], 10];

sub to_null {
    my $arr = shift;

    map { ref ? to_null($_) : ($_ = 0) } @{ $arr };
};

to_null($a);

print Dumper $a;

Основная работа происходит здесь:

map { ref ? to_null($_) : ($_ = 0) } @{ $arr };

С помощью map поочерёдно пройдёмся по значениям из набора, предварительно преобразовав ссылку на набор $arr к самому набору с помощью @{ }.

Затем, для каждого значения выполняем проверку ref, которая вернёт ARRAY, если это ссылка на набор и, в зависимости от этого, либо присваиваем значению ноль, либо вызываем данный вызов для вложенного набора.

Изменения происходят над текущим набором, без создания нового.

→ Ссылка