Как заменить все значения в массиве на 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
Первая функция модифицирует содержимое исходного массима, а вторая создаёт копию.
Нужно использовать вызов, который вызывает самого себя для случая, если значение из набора является ссылкой на другой набор. На перл это можно сделать примерно так:
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, если это ссылка на набор и, в зависимости от этого, либо присваиваем значению ноль, либо вызываем данный вызов для вложенного набора.
Изменения происходят над текущим набором, без создания нового.