2013-07-14 2 views
6

Я хочу инициализировать многомерный список. В принципе, я хочу сетку 10x10 - список из 10 списков, каждый из которых содержит 10 элементов.Python: инициализировать многомерный список

Каждое значение в списке должны быть инициализированы в целое число 0.

Очевидный способ сделать это в однострочника: myList = [[0]*10]*10 не будет работать, потому что она производит список из 10 ссылок на один список, так что изменение элемент в любой строке меняет его во всех строках.

Документация Я видел переговоры об использовании [:] скопировать список, но это все равно не будет работать при использовании множителя: myList = [0]*10; myList = myList[:]*10 имеет тот же эффект, как myList = [[0]*10]*10.

Не удалось создать цикл myList.append() s, есть ли эффективный способ инициализации списка таким образом?

+0

Я думаю, что идея '[:]' может также работать, например. '[x [:] для x в [[0] * 10] * 10]'. – DSM

ответ

14

Вы можете сделать это достаточно эффективно с пониманием:

a = [[0] * number_cols for i in range(number_rows)] 
+1

Ницца, избегает вложенного цикла цикла, который имеет очевидный ответ, но работает только в том случае, если значение, для которого вы хотите инициализировать массив, можно называть многократно, поэтому нет, если вы хотите, чтобы массив заполнялся уникальными экземплярами класса. – Perkins

+0

Это правильно. Рад, что вы это придумали. – cheeyos

+0

Perfect. Прекрасно работает. Благодаря! – fdmillion

7

Это работа для ... понимания вложенных списков!

[[0 for i in range(10)] for j in range(10)] 
+1

Я считаю, что это более ясно и * обычно * предпочтительнее альтернатив (например, используя '[0] * 10'). – ZX9

0

Вы могли бы на самом деле нужен array вместо некоторых списков. Почти каждый раз, когда я вижу этот шаблон «заданного вложенного списка», что-то не совсем правильно.

2

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

n_dims = [3, 4, 5] 

empty_list = 0 
for n in n_dims: 
    empty_list = [empty_list] * n 

>>>empty_list 
>>>[[[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

У этой проблемы возникает проблема, описанная в вопросе - она ​​создает много ссылок на один и тот же список. –

Смежные вопросы