修改循环中的列表项(python)

时间:2010-07-04 06:21:59

标签: python loops items

我正在尝试使用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 个答案:

答案 0 :(得分:65)

请改为尝试:

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]

答案 1 :(得分:5)

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

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

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

但是如果您只想循环播放它们,请使用David建议的enumerate()

答案 2 :(得分:0)

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

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