2017-02-21 14 views
0

У меня вопрос об использовании вложенной отдельной строки для цикла в python. В частности, у меня есть следующие:Почему моя петля не работает как одна строка?

A = [[tmp1[a][b]/tmp2[a] for b in range(0,10)] for a in range(0,20)] 

Согласно Here, одна строка для цикла эквивалентно, как

for a in range(0,20): 
    for b in range (0, 10): 
     A.append(tmp1[a][b]/tmp2[a]) 

Однако питон дает мне следующую ошибку:

AttributeError: 'numpy.ndarray' object has no attribute 'append'.

Как мне изменить структуру, чтобы я использовал double for loop вместо одиночной строки, вложенной в цикл?

Update:

A=[] 
for a in range(0,20): 
    B = [] 
    for b in range (0, 10): 
     B.append(tmp1[a][b]/tmp2[a]) 
    A.append(B) 
+4

Вы не * инициализации * 'A' правильно ... Вы забыли' A = [] 'часть. –

+3

Это не однострочный цикл 'for'; это понимание списка. Они оба просто используют одно и то же ключевое слово. – chepner

+0

Append is for native 'list' –

ответ

1

, если вы:

for a in range(0,20): 
    for b in range (0, 10): 
     A.append(tmp1[a][b]/tmp2[a]) 

A должен быть список, чтобы иметь атрибут append:

A=[] 
for a in range(0,20): 
    for b in range (0, 10): 
     A.append(tmp1[a][b]/tmp2[a]) 

Этот метод отличается это list comprehension (способ создания списка):

A = [tmp1[a][b]/tmp2[a] for a in range(0,20) for b in range(0,10)] 
+0

Но я замечаю разницу, хотя – wrek

+0

у вас есть разные результаты? – Dadep

+0

Да, я думаю, вы должны пойти: – wrek

1

Есть два способа настройки списка вашего понимания

Это

A = [tmp1[a][b]/tmp2[a] for a in range(0,20) for b in range(0,10)] 

производит плоский список.

Это:

B = [[tmp1[a][b]/tmp2[a] for b in range(0,10)] for a in range(0,20)] 

производит вложенный список.

Обязательно обратите внимание на своп между двумя инструкциями. Во вложенном случае медленно меняющаяся переменная появляется последней, в плоском случае она на первом месте.

эквивалентные циклы

A=[] 
for a in range(0,20): 
    for b in range (0, 10): 
     A.append(tmp1[a][b]/tmp2[a]) 

и

B=[] 
for a in range(0,20): 
    inner=[] 
    for b in range (0, 10): 
     inner.append(tmp1[a][b]/tmp2[a]) 
    B.append(inner) 

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

  • Нет связанных вопросов^_^