Подтвердить что ты не робот

Изменение элементов списка в цикле (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

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

4b9b3361

Ответ 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]

Ответ 2

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

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

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

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

Ответ 3

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

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