Как читать/записать вложенный список в python?
0. Как создать вложенный список 5x5: например, такой list [5][5] -> понятно:
lst=[5],[5]
1. Как записать одно значение -> понятно:
lst=[5],[5]
lst[0][0]='123'
lst[1][2]='1234567'
2. Как итерировать, читая вложенный список -> понятно:
lst=[5],[5]
for y in range (0, 4):
for x in range(0, 4):
Value=lst[y][x]
print(Value)
3. Как заполнить вложенный лист, его итерируя по элементам -> не понятно:
lst=[5],[5]
for x in range (5)
for y in range(5)
lst[x][y].insert(Value) #здесь не работает приёмчик
print(lst)
Ответы (3 шт):
К сожалению, у вас многое неправильно.
Не называйте переменную именем встроенного типа.
Эта конструкция list=[5],[5] НЕ создает список 5x5, а делает два списочка по одному элементу со значением 5, и объединяет их в кортеж (tuple)
Чтобы создать двумерный список, можно использовать списковое включение (я сделал покороче)
lst = [[0]*3 for _ in range(3)]
или поэлементно добавляя одномерные списки
lst = []
for i in range(3):
lst.append([0]*3)
Если вы хотите добавлять элементы к подспискам, то это делается append-ом к элементам первого уровня
lst[2].append(6)
P.S. При сомнениях в правильности получаемых структур просто печатайте их print-ом
[[0, 0, 0], [0, 0, 0], [0, 0, 0, 6], [0, 0, 0], [0, 0, 0]]
Мой дивный друг, вот что получилось:
lst=[] #Создаем лист, пока без размера для 2D
lst0=[] #Создаем лист, пока без размера для 3D
def Create_2D_List(X,Y): #Создаем функцию создания листа с размерностью (X)*(Y)
global lst
lst = [[0]*X for _ in range(Y)]
def Create_3D_List(X,Y,Z):#Создаем функцию создания листа с размерностью (X)*(Y)*(Z)
global lst0
lst0 =[[[0]*X for i in range(Y)] for j in range(Z)]
def Fill_2D_List():#Заполняем 2D-лист: lst стандартными значениями
global lst
X = len(lst)
Y = len(lst[0])
for x in range(X):
for y in range(Y):
lst[x][y]=str (x)+' '+ str(y) #стандартное сзначение
def Fill_3D_List(): #Заполняем 3D-лист: lst0 стандартными значениями
global lst0
X = len(lst0)
Y = len(lst0[0])
Z = len(lst0[0][0])
for x in range(X):
for y in range(Y):
for z in range(Z):
lst0[x][y][z]=str (x)+ str(y) + str(z)#стандартное сзначение
Create_2D_List(4,7) #Создали массив 2D 4*7
Create_3D_List(2,4,8) #Создали массив 3D 2*4*8
Fill_2D_List() #Заполинили 2D массив
Fill_3D_List() #Заполинили 3D массив
lst[0][0]='MyValue_2D'#Наполинили 2D массив
lst0[0][0]='MyValue_3D'#Наполинили 2D массив
print(lst) #Отобразили в консоле массив
print('=-----------------=') #Отобразили в консоле массив
print(lst0) #Отобразили в консоле массив
Кажется я понял чего вы хотите. 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']]]