修改循环中的列表项(python)
我试图使用for循环修改列表中的项目,但出现了一个错误(见下文)。示例代码:修改循环中的列表项(python),python,loops,items,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 re
#!/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
回溯(最近一次呼叫最后一次):
文件“/testy.py”,第11行,在
数据[项目]=“一切”
TypeError:列表索引必须是整数,而不是str
有什么办法解决这个问题吗?试试这个:
for i in xrange(len(data)):
data[i] = "everything"
您面临的基本问题是,当您编写数据[i]
时,如果数据是一个列表,i
需要是一个整数,即列表中的数字索引。但是在循环中
for item in data
项
是列表中的实际对象,即字符串,而不是对象的数字索引xrange
是一个迭代器,它生成数字而不是列表中的值,因此您可以使用它
另一种选择是
for i, _ in enumerate(data):
data[i] = "everything"
enumerate
函数为您提供了一个对元组的迭代器,其形式为(索引,项)
,因此您所需要做的就是获取索引并忽略该项。我不确定这样或那样(enumerate
或xrange
)会更快或更好,因为我认为列表将其长度存储在一个变量中,因此可以在不通过列表元素计数的情况下快速访问
但是,如果您需要旧的列表值来计算新的列表值,则枚举
方法可能会稍微快一点,因为您可以避免让Python在列表中查找元素:
for i, item in enumerate(data):
data[i] = func(item)
这类事情最好用列表理解来表达,不过:
data = [func(item) for item in data]
执行此操作时,Python将遍历data
中的每个项目,对其应用函数,并根据结果自动构造一个新列表,因此您无需担心将func(项目)
的结果放在列表中的正确位置。您最初的示例实际上可以表示为
data = ["everything" for item in data]
列表项通过整数索引访问,即。E在您的示例中,数据[1]==“示例”
。这就是为什么在使用字符串作为查找时Python会抱怨的原因
如果您想通过值在列表中查找元素,可以使用data.index(“value”)
:
但是,如果您只是想循环使用它们,请按照David的建议使用enumerate()
。使用整数对列表进行索引可能效率低下。python很可能使用带有底层指针的链接表存储列表元素。在本例中,为了查找特定项,python必须遍历列表,直到找到第i项
建议使用这样的格式可能是有效的:
a[:]=[x*x代表a中的x]它看起来有点奇怪(或变通方法),但工作正常。我不知道覆盖项(在列表中)必须有ID。谢谢。@sigo:这实际上根本不是一个解决办法,这是完成这类任务的100%正确且完全正常的方法(但请注意我所说的列表理解)。在这种特殊情况下,列表理解可以被更快的数据=[“everything”]*len(data)
。关于内存消耗和列表理解的旁注:这将需要(暂时)内存来存储旧的数据和新的数据。因此,对于大型列表,索引修改可能更可取。
data[data.index("some")] = "something else"