Кажется я понял чего вы хотите. make_nlist
создаёт вложенный список по списку размеров. Например make_nlist([2, 3])
создаст "двумерный" список размера 2×3:
def make_nlist(dim):
if len(dim) == 0:
return None
head, *tail = dim
return [make_nlist(tail) for _ in range(head)]
fill_nlist(nlist, cb)
заполняет вложенный список значениями. Значения вычисляются в функции cb
, в которую передаётся кортеж из индексов:
def fill_nlist(nlist, cb):
def traverse(index, nlist):
for i, v in enumerate(nlist):
if isinstance(v, list):
traverse(index + (i, ), v)
else:
nlist[i] = cb(index + (i, ))
traverse((), nlist)
Пример использования:
import pprint
pprint.pprint(make_nlist([2, 3]))
a = make_nlist([2, 3, 4])
pprint.pprint(a)
fill_nlist(a, lambda index: ''.join(map(str, index)))
pprint.pprint(a)
$ python nlist.py
[[None, None, None], [None, None, None]]
[[[None, None, None, None], [None, None, None, None], [None, None, None, None]],
[[None, None, None, None], [None, None, None, None], [None, None, None, None]]]
[[['000', '001', '002', '003'],
['010', '011', '012', '013'],
['020', '021', '022', '023']],
[['100', '101', '102', '103'],
['110', '111', '112', '113'],
['120', '121', '122', '123']]]