Ответ 1
Попробуйте это вместо:
for i in xrange(len(data)):
data[i] = "everything"
Основная проблема, с которой вы сталкиваетесь, заключается в том, что когда вы пишете data[i]
, а data
является списком, i
должен быть целым числом, числовым индексом в списке. Но в цикле
for item in data
item
- это то, что в списке, т.е. строка, а не числовой индекс вещи. xrange
- это итератор, который производит числа вместо значений в списке, поэтому вы можете использовать это.
Альтернативой будет
for i, _ in enumerate(data):
data[i] = "everything"
Функция enumerate
дает вам итератор над кортежами формы (index, item)
, поэтому все, что вам нужно сделать, это взять индекс и забыть об элементе. Я не уверен, что так или иначе (enumerate
или xrange
) будет значительно быстрее или лучше, так как я думаю, что списки хранят свою длину в переменной, поэтому ее можно быстро получить без учета элементов списка.
Однако, если вам нужно значение старого списка для вычисления нового значения списка, путь enumerate
, вероятно, будет немного быстрее, потому что вы избежите того, чтобы Python просматривал элемент в списке:
for i, item in enumerate(data):
data[i] = func(item)
Такая вещь лучше выражается в понимании списка:
data = [func(item) for item in data]
Когда вы это сделаете, Python перейдет через каждый элемент в data
, применит к нему функцию и автоматически построит новый список из результатов, поэтому вам не нужно беспокоиться о том, чтобы поместить результат func(item)
в нужном месте в списке. Ваш оригинальный пример может быть фактически выражен как
data = ["everything" for item in data]