31

我正在尝试使用 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

有没有办法解决这个问题?

4

3 回答 3

74

试试这个:

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),因此您需要做的就是获取索引并忘记该项目。我不确定一种或另一种方式(enumeratexrange)会明显更快或更好,因为我认为列表将它们的长度存储在一个变量中,因此可以快速访问它而无需计算列表元素。

但是,如果您需要旧的列表值来计算新的列表值,这种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]
于 2010-07-04T06:24:15.920 回答
5

列表项通过整数索引访问,即在您的示例data[1] == 'example'中。这就是为什么当您使用字符串作为查找时 Python 会抱怨的原因。

如果要通过值在列表中查找元素,可以使用data.index("value")

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

但是,如果您只想遍历它们,请enumerate()按照 David 的建议使用。

于 2010-07-04T06:27:54.387 回答
0

使用整数对列表进行索引可能效率低下。python 很可能使用带有底层指针的链接表来存储列表元素。在这种情况下,要查找特定项目,python 必须遍历列表直到第 i 个项目。

建议使用这样的格式可能是有效的:a[:] = [x*x for x in a]

于 2015-08-06T14:34:51.493 回答