Модификация элементов списка в цикле (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" 

Ошибка:

  • Печать при нажатии мыши
  • Поиск второго наименьшего числа с использованием циклов в python
  • Петля, пока пользовательский ввод
  • Как подсчитать уникальные значения внутри массива в Python?
  • Почему вы должны вызывать .iteritems () при итерации по словарю в python?
  • Как переписать рекурсивную функцию для использования цикла?
  •  Traceback (most recent call last): File "./testy.py", line 11, in <module> data[item] = "everything" TypeError: list indices must be integers, not str 

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

  • Поиск второго наименьшего числа с использованием циклов в python
  • Как подсчитать уникальные значения внутри массива в Python?
  • Проблема цикла при повторении через список и удалении повторяющихся элементов
  • Доступ к индексу в циклах Python for for
  • В чем разница между функциями range и xrange в Python 2.X?
  • Как переписать рекурсивную функцию для использования цикла?
  • 3 Solutions collect form web for “Модификация элементов списка в цикле (python)”

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

     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 или изменение) будет значительно быстрее или лучше, так как я думаю, что списки хранят свою длину в переменной, поэтому ее можно быстро получить без учета элементов списка.

    Однако, если вам нужно значение старого списка для вычисления нового значения списка, путь 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] 

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

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

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

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

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

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

    Python - лучший язык программирования в мире.