Более элегантный способ создания 2D-матрицы в Python

Возможный дубликат:
Как инициализировать двумерный массив в Python?

Я всегда писал эту часть кода следующим образом: каждый раз, когда мне это нужно, я использую этот код python:

for x in range(8):
        a.append([])
        for y in range(8):
            a[x].append(0)

Однако, я хотел бы знать, есть ли способ украсить этот кусок кода. Я имею в виду, как вы создаете двумерную матрицу в python и заполняете ее 0?

Ответы

Ответ 1

Используйте вложенные списки:

a = [[0 for y in range(8)] for x in range(8)]

который эквивалентен

a = []
for x in range(8):
    row = []
    for y in range(8):
        row.append(0)
    a.append(row)

Ответ 2

Попробуйте следующее:

a = [[0]*8 for _ in xrange(8)]

Он использует списки и то, что оператор * может быть применен к спискам для их заполнения n копиями данного элемента.

Или, что еще лучше, напишите общую функцию для возвращаемых матриц заданного размера:

# m: number of rows, n: number of columns
def create_matrix(m, n):
    return [[0]*n for _ in xrange(m)]

a = create_matrix(8, 8)

Ответ 3

Понимание списка более кратким.

a = [[0 for i in xrange(8)] for i in xrange(8)]
print a

Или вы можете использовать массивы numpy, если вы будете выполнять численные вычисления с массивом. Функция Numpy.zeros создает многомерный массив нулей.

import numpy as np

a = np.zeros((8,8))

Ответ 4

Вы можете использовать список понятий. Поскольку вам не нужны значения, предоставляемые range, вы можете использовать _, который обычно обозначает значение, которое не интересует.

>>> z = [[0 for _ in range(8)] for _ in range(8)]
>>> import pprint
>>> pprint.pprint(z)
[[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, 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, 0, 0]]

Перечисления списков предоставляют сжатый способ создания списков, не прибегая к использованию карт(), filter() и/или лямбда. Полученное определение списка часто бывает более четким, чем списки, построенные с использованием этих конструкций.