Ответ 1
Использование вложенных списков понимания:
x = [[None for _ in range(5)] for _ in range(6)]
Я создаю массив 6x5 2d, изначально только с None в каждой ячейке. Затем я прочитал файл и заменил Nones данными, когда прочитал их. Сначала я создаю пустой массив, потому что данные находятся в порядке undefined в файле, который я читаю. Моя первая попытка я сделал это:
x = [[None]*5]*6
что привело к некоторым странным ошибкам, которые я теперь понимаю, потому что оператор * в списках может создавать ссылки вместо копий.
Есть ли простой лайнер для создания этого пустого массива? Я мог бы просто сделать некоторые из циклов и создать их, но это выглядит излишне подробным для python.
Использование вложенных списков понимания:
x = [[None for _ in range(5)] for _ in range(6)]
Что здесь происходит, так это то, что строка
x = [[None]*5]*6
расширяется до
x = [[None, None, None, None, None, None]]*6
В этот момент у вас есть список с 6 различными ссылками на singleton None
. У вас также есть список со ссылкой на внутренний список, поскольку он первый и единственный вход. Когда вы умножаете его на 6, вы получаете еще 5 ссылок на внутренний список, как вы понимаете. Но дело в том, что нет проблем с внутренним списком, просто внешним, поэтому нет необходимости расширять построение внутренних списков в понимании.
x = [[None]*5 for _ in range(6)]
Это позволяет избежать дублирования ссылок на какие-либо списки и примерно столь же кратким, как я могу с уверенностью предположить.
Если вы не собираетесь маршрутом numpy, вы можете подделать 2D-массивы со словарями:
>>> x = dict( ((i,j),None) for i in range(5) for j in range(6) )
>>> print x[3,4]
None