我正在尝试使用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
有什么方法可以解决这个问题吗?
答案 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)
形式的元组的迭代器,因此您需要做的就是获取索引并忘记该项。我不确定这种方式或其他方式(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]
答案 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]