Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修改循环中的列表项(python)_Python_Loops_Items - Fatal编程技术网

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

修改循环中的列表项(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

我试图使用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
回溯(最近一次呼叫最后一次):
文件“/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"