2013-11-21 2 views
2

У меня есть список под названием «мб», его формат:Python - Почему этот код считается генератором?

['Company Name', 'Rep', Mth 1 Calls, Mth 1 Inv Totals, Mth 1 Inv Vol, Mth 2 

... И так далее

В коде ниже я просто добавить новый список 38 0-х. Это отлично.

Однако в следующей строке я получаю сообщение об ошибке: «генератор» объект не поддерживает назначение элемента

Может кто-нибудь сказать мне: 1) как исправить эту ошибку, и 2) почему LEN (мб) -1 ниже считается генератором.

Примечание: строка [0] является просто «фирменным наименованием», содержащимся в другом списке.

mb.append(0 for x in range(38)) 
mb[len(mb)-1][0]=row[0] 
+2

Чтобы сделать ваш код более аккуратным, обратите внимание, что 'mb [len (mb) -1] == mb [-1]' – jonrsharpe

+0

Спасибо, очень благодарен. – Phoenix

ответ

10

В самом деле, вы не присоединяют список 38 0s: вы присоединять генератор, который будет уступать0 38 раз. Это не то, что вы хотите. Тем не менее, вы можете изменить можно изменить mb.append(0 for x in range(38)) к

mb.append([0 for x in range(38)]) 
# note the [] surrounding the original generator expression! This turns it 
# into a list comprehension. 

или, более просто (спасибо @John за указание на это в комментариях)

mb.append([0] * 38) 
+2

Или 'mb.extend ([0] * 38)', но устраняет ли это проблему OP? –

+0

@JohnZwinck К сожалению, я не понял, что OP действительно хотел добавить список 0s. Дурак я. –

+0

Разве это не создает список с 1 элементом, который содержит 38 раз 0? Я думаю, вам нужно использовать '.extend()' –

5

Вы должны сделать это вместо того, чтобы:

mb.extend([0]*38) 

Таким образом вы добавляете 38 нулей, вместо добавления одного выражения генератора, заданного range() (nb в Python 2, который дал список вместо).

И использование extend вместо append делает список более длинным на 38 вместо того, чтобы сделать его более длинным на 1 и иметь 1 новый элемент в списке из 38 нулей.

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