2014-12-14 2 views
1

Я новичок в Python, и для некоторых целей я пытаюсь выяснить, как работать со списком списков списков.Создание и работа со списком списков списков: в Python

Вот что я делаю:

segment_coef = [[list()]*4]*17 
print segment_coef 
segment_coef[0][0].append(1) 
segment_coef[1][0].append(2) 
segment_coef[2][0].append(3) 
print segment_coef 

После первого print у меня есть:

[ [ [],[],[],[] ] , ... 14 more time ... , [ [],[],[],[] ] ] 


После этих трех append команд я хотел бы иметь л, как:

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

Но у меня есть:

[ [ [1,2,3],[1,2,3],[1,2,3],[1,2,3] ] , [ [1,2,3],[1,2,3],[1,2,3],[1,2,3] ], ... up to the end ] 

Что я делаю неправильно?

+0

нет необходимости добавлять, список [0] [0] = 1 должен работать – chris

+0

@chris, но мне нужно указать [0] [0] тоже список – tema

ответ

2

Есть несколько способов, чтобы создать список 17 списков 4 подсписков каждого

кратчайшее бы

[[list() for i in range(4)] for j in range(17)] 

Если вы сделаете это, ваш Присоединяет будет работать, как вы хотите, чтобы они

Если вы знакомы с языками, как C или Java, которые не имеют списковых, таким образом, ми GHT выглядеть более знакомо:

l = [] 
for j in range (17): 
    k = [] 
    for i in range (4): 
    k.append(list()) 
    l.append (k) 

Это также приемлемо, но для многих питона головок, список понимание является предпочтительным. Список comp должен быть по эффективности по меньшей мере столь же хорош, как и понимание.

4

Python использует тот же список 4 раз, то он использует тот же список из 4 списков 17 раз!

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

В зависимости от того, как/где вы получите ваши данные, зависит от того, лучший способ это исправить, но что-то вроде:

lols = [] 
for i in range(17): 
    lols.append([1,2,3,4]) 
# lols is not a list of 17 lists, each list contains the same data but they are different lists 
lols[0][0] = 99 
# Now only the first element from the first list is updated. 

Чтобы было ясно, вопрос приходит от делать [list() * 4], который construsts список (используя list), а затем повторяет его 4 раза. Если вы сделали [list(), list()m list(), list()] вы получите 4 разных (но все пустые) списки, или, более pythonically, [list() for _ in range(4)] или просто [[] for _ in range(4)]

+0

Я думаю, что у меня оно есть. Есть ли решение для этого? – tema

+0

Итак, нет способа вызвать конструктор 4 раза? – tema

+0

Есть несколько способов - см. Мой вариант редактирования или другой ответ ниже. –

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