Как создать вложенные списки в Python? - PullRequest
6 голосов
/ 31 января 2010

Я знаю, что вы можете создавать легко вложенные списки в Python, как это:

[[1,2],[3,4]]

Но как создать матрицу нулей 3х3х3?

[[[0] * 3 for i in range(0, 3)] for j in range (0,3)]

или

[[[0]*3]*3]*3

Не кажется правильным. Нет способа создать его, просто передав в метод список измерений? Пример:

CreateArray([3,3,3])

Ответы [ 5 ]

9 голосов
/ 31 января 2010

Если матрица действительно то, что вы ищете, рассмотрите пакет numpy.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

Это даст вам массив нулей 3x3x3:

numpy.zeros((3,3,3)) 

Вы также можете воспользоваться удобными функциями модуля, созданного для научных вычислений.

1 голос
/ 31 января 2010

Понимания списка - это просто синтаксический сахар для придания выразительности инициализации списка; в вашем случае я бы их вообще не использовал, а пошел бы на простой вложенный цикл.

На совершенно другом уровне: как вы думаете, n-мерный массив NumPy может быть лучшим подходом?
Хотя вы можете использовать списки для реализации многомерных матриц, я думаю, что они не лучший инструмент для этой цели.

1 голос
/ 31 января 2010

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
0 голосов
/ 23 февраля 2010

Или используйте функцию nest, определенную здесь в сочетании с repeat (0) из модуля itertools:

nest(itertools.repeat(0),[3,3,3])
0 голосов
/ 31 января 2010

Просто вложите синтаксис умножения:

[[[0] * 3] * 3] * 3

Поэтому эту операцию просто выразить, используя folds

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
...