2009-12-11 3 views
2

Я пытаюсь создать 3-мерное N N N список в Python, как например:Проблема создания N * N * N список в Python

n=3 
l = [[[0,]*n]*n]*n 

К сожалению, это, кажется, не правильно «клонировать» список, как я думал:

>>> l 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
>>> l[0][0][0]=1 
>>> l 
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]]] 

Что я здесь делаю неправильно?

+0

Если вы планируете выполнять множество матричных операций, вы можете попасть в 'numpy', но мне нравится использовать индексы, индексированные кортежами как многомерные массивы:' from collections import defaultdict; d = defaultdict (int); d [0,0,0] = 1' - это может пригодиться вашему 3D-тик-таку. –

ответ

5

Проблема в том, что * n делает мелкую копию списка. Решение - использовать вложенные циклы или попробовать библиотеку numpy.

2

Это не клонирование списка. Он снова и снова добавляет ссылку на один и тот же список. Попробуйте создать список, используя набор вложенных циклов.

3

Как уже упоминалось, он строит 2-й и 3-й уровни со ссылками, а не клонами. Попробуйте:

>>> n = 3 

>>> l = [[[0]*n for _ in xrange(n)] for _ in xrange(n)] 

>>> l[0][0][0] = 1 

>>> l 
[[[1, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 

Или, если вы хотите, чтобы набрать немного меньше:

>>> l = [[[0]*n for _ in '.'*n] for _ in '.'*n] 
4

Если вы хотите сделать цифровую обработку с 3-й матрицы вы лучше использовать NumPy. Это довольно легко:

>>> import numpy 
>>> numpy.zeros((3,3,3), dtype=numpy.int) 
array([[[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     [[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     [[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]]]) 
>>> _[0,0,0] 
0 
2

Я должен второй, что-santagada Леонардо предложил, с тем дополнением, что создание N мерных массивов/списков очень unpythonic и вы должны пересмотреть, как ты хранишь свои данные и увидеть если он не принадлежит лучше в классе или списке словарей (или словарей списков).

+0

Спасибо, что указали это. Мне понадобилось это, чтобы создать трехмерную плату tic-tac-toe для алгоритма AI. Хотя верно, что массивы numpy могли ускорить некоторые операции, я решил, что это будет «достаточно хорошо» для этой небольшой программы. –

Смежные вопросы