Как создать вложенные списки в Python?
Я знаю, что вы можете легко создавать вложенные списки в python следующим образом:
[[1,2],[3,4]]
но как создать матрицу 3x3x3 нулей?
[[[0] * 3 for i in range(0, 3)] for j in range (0,3)]
или
[[[0]*3]*3]*3
не кажется правильным. Нет способа создать его, просто передав список измерений методу? Ex:
CreateArray([3,3,3])
5 ответов
если матрица действительно то, что вы ищете, рассмотрим пакет numpy.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros
Это даст вам массив нулей 3x3x3:
numpy.zeros((3,3,3))
вы также извлекаете пользу из особенностей удобства модуля построенного для научный вычислять.
list comprehensions - это просто синтаксический сахар для добавления выразительности в инициализацию списка; в вашем случае я бы не использовал их вообще и пошел на простой вложенный цикл.
на совершенно другом уровне:думаешь n-мерный массив NumPy может быть лучшим подходом?
Хотя вы можете использовать списки для реализации многомерных матриц, я думаю, они не лучший инструмент для этой цели.
NumPy решает эту проблему
http://www.scipy.org/Tentative_NumPy_Tutorial#head-d3f8e5fe9b903f3c3b2a5c0dfceb60d71602cf93
>>> 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
или используйте функцию nest defined здесь, в сочетании с повтором (0) из модуля itertools:
nest(itertools.repeat(0),[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