Try this instead:
for i in xrange(len(data)):
data[i] = "everything"
The basic problem you're having is that when you write data[i]
, with data
being a list, the i
needs to be an integer, a numerical index into the list. But in the loop
for item in data
item
is the actual thing that's in the list, i.e. a string, not the numerical index of the thing. xrange
is an iterator that produces numbers instead of the values in the list, so you can use that.
An alternative would be
for i, _ in enumerate(data):
data[i] = "everything"
The enumerate
function gives you an iterator over tuples of the form (index, item)
, so all you need to do is take the index and forget about the item. I'm not sure that one way or the other (enumerate
or xrange
) will be significantly faster or better, since I think lists store their length in a variable so it can be quickly accessed without counting through the list elements.
However, if you need the old list value to compute the new list value, the enumerate
way will probably be slightly faster because you avoid making Python look up the element in the list:
for i, item in enumerate(data):
data[i] = func(item)
This sort of thing is better expressed as a list comprehension, though:
data = [func(item) for item in data]
When you do this, Python will go through each item in data
, apply the function to it, and construct a new list from the results automatically, so you don't need to worry about putting the result of func(item)
in the right place in the list. Your original example could actually be expressed as
data = ["everything" for item in data]