Я знаю, что можно создать легко вложенные списки в Python как это:
[[1,2],[3,4]]
Но как создать 3x3x3, матрица обнуляет?
[[[0] * 3 for i in range(0, 3)] for j in range (0,3)]
или
[[[0]*3]*3]*3
Не кажется правильным. Нет никакого способа создать его просто передача списка размеров к методу? Исключая:
CreateArray([3,3,3])
В случае, если матрица на самом деле вы ищете, учитывайте Numpy Package.
http://docs.cscipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros.html#numpy.zeros
Это даст вам массив Zeros 3x3x3:
numpy.zeros((3,3,3))
вы также получаете выгоду от Удобство удобств модуля, построенного для научных вычислений.
Просто гнездите в синтаксисе умножения:
[[[0] * 3] * 3] * 3
, следовательно, просто выразить эту операцию, используя складки
def zeros(dimensions):
return reduce(lambda x, d: [x] * d, [0] + dimensions)
или если вы хотите избежать репликации ссылки, поэтому изменение одного элемента не будет влияет на любой другой, вы должны вместо этого использовать копии:
import copy
def zeros(dimensions):
item = 0
for dimension in dimensions:
item = map(copy.copy, [item] * dimension)
return item
Сообщение списка - это просто синтаксический сахар для добавления выраженности для перечисления инициализации; В вашем случае я бы не использовал их вообще и пойти на простую вложенную петлю.
На совершенно другом уровне: Как вы думаете, N-мерный массив Numpy может быть лучшим подходом?
Хотя вы можете использовать списки для реализации многомерных матриц, я Думаю, что они не лучший инструмент для этой цели.
Numpy обращается к этой проблеме
>>> a = array( [2,3,4] )
>>> a
array([2, 3, 4])
>>> type(a)
<type 'numpy.ndarray'>
Но если вы хотите использовать родные списки Python в качестве матрицы, следующие методы помощника могут стать удобными:
import copy
def Create(dimensions, item):
for dimension in dimensions:
item = map(copy.copy, [item] * dimension)
return item
def Get(matrix, position):
for index in position:
matrix = matrix[index]
return matrix
def Set(matrix, position, value):
for index in position[:-1]:
matrix = matrix[index]
matrix[position[-1]] = value
Или используйте функцию вложенности, определенную здесь , в сочетании с repeat (0) из модуля itertools:
nest(itertools.repeat(0),[3,3,3])