Изменение элементов списка в цикле (python) [дубликат]

этот вопрос уже есть ответ здесь:

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

#!/usr/bin/env python
# *-* coding: utf8 *-*

data = []
data.append("some")
data.append("example")
data.append("data")
data.append("here")

for item in data:
    data[item] = "everything"

ошибка:

Traceback (most recent call last):
  File "./testy.py", line 11, in <module>
    data[item] = "everything"
TypeError: list indices must be integers, not str

есть ли способ решить эту проблема?

3 ответов


попробуйте это вместо этого:

for i in xrange(len(data)):
    data[i] = "everything"

основная проблема-то, что когда вы пишите data[i] С data будучи в списке i должно быть целым числом, числовым индексом в списке. Но в петле

for item in data

item - это фактическая вещь, которая находится в списке, т. е. строка, а не числовой индекс вещи. xrange - это итератор, который производит числа вместо значений в списке, поэтому вы можете использовать это.

An альтернативой было бы

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]

элементы списка доступны по целочисленному индексу, i. e. в вашем примере data[1] == 'example'. Вот почему Python жалуется, когда вы используете строку в качестве поиска.

если вы хотите, чтобы найти элемент в списке по его значению, вы можете использовать data.index("value"):

data[data.index("some")] = "something else"

но если вы просто хотите зациклиться на них, используйте enumerate() как предложил Дэвид.


индексирование списка с помощью целых чисел может быть неэффективным. Вполне вероятно, что python хранит элементы списка, используя связанную таблицу с базовыми указателями. В этом случае, чтобы найти конкретный элемент, python должен пройти по списку до i-го элемента.

предполагается, что использование такого формата может быть эффективным: a [:] = [x*x для x в a]