Подтвердить что ты не робот

Создание 2d-матрицы в python

Я создаю массив 6x5 2d, изначально только с None в каждой ячейке. Затем я прочитал файл и заменил Nones данными, когда прочитал их. Сначала я создаю пустой массив, потому что данные находятся в порядке undefined в файле, который я читаю. Моя первая попытка я сделал это:

x = [[None]*5]*6

что привело к некоторым странным ошибкам, которые я теперь понимаю, потому что оператор * в списках может создавать ссылки вместо копий.

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

4b9b3361

Ответ 1

Использование вложенных списков понимания:

x = [[None for _ in range(5)] for _ in range(6)]

Ответ 2

Что здесь происходит, так это то, что строка

x = [[None]*5]*6

расширяется до

x = [[None, None, None, None, None, None]]*6

В этот момент у вас есть список с 6 различными ссылками на singleton None. У вас также есть список со ссылкой на внутренний список, поскольку он первый и единственный вход. Когда вы умножаете его на 6, вы получаете еще 5 ссылок на внутренний список, как вы понимаете. Но дело в том, что нет проблем с внутренним списком, просто внешним, поэтому нет необходимости расширять построение внутренних списков в понимании.

x = [[None]*5 for _ in range(6)] 

Это позволяет избежать дублирования ссылок на какие-либо списки и примерно столь же кратким, как я могу с уверенностью предположить.

Ответ 3

Если вы не собираетесь маршрутом numpy, вы можете подделать 2D-массивы со словарями:

>>> x = dict( ((i,j),None) for i in range(5) for j in range(6) )
>>> print x[3,4]
None