当前位置: 首页 > 面试题库 >

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

甘兴学
2023-03-14
问题内容

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

有什么办法解决这个问题?


问题答案:

尝试以下方法:

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]


 类似资料:
  • 问题内容: 现在,我知道在迭代循环中修改列表是不安全的。但是,假设我有一个字符串列表,并且我想剥离字符串本身。可变值的替换是否算作修改? 问题答案: 它被认为是不良形式。如果需要保留对列表的现有引用,请改用列表理解和切片分配。

  • 问题内容: 在Python中遍历列表时,如果没有列表理解,就无法修改元素。以供参考: 那么,为什么不能通过Python中的循环修改元素?肯定有一些我想念的东西,但是我不知道是什么。我确定这是重复的,但是我找不到与此相关的问题,如果有链接,那就绰绰有余了。 问题答案: 因为工作方式是这样的: 所以如果你给i它分配任何东西都不会影响。 解决方案是您所建议的,或者遍历索引: 或使用:

  • 问题内容: 我目前有一些这样的代码: 我想发生的事情是for循环迭代并用其对应的字母替换任何大于10的值。但是,我当前的代码只是更改,而不是列表中的原始值。例如,如果设置为15,则代码始终运行并设置为,但不会更改为,而是保持为15。如何解决此问题? 问题答案: 对于循环的每次迭代,变量只会被分配一个项的值的副本,因此对所做的更改将不会反映在。 您应该更新可以通过以下函数生成的via索引项:

  • 问题内容: 嗨,我有一个问题,在遍历python中的列表时我似乎无法删除项目,这就是我得到的:如果用户在for循环中被问到要删除的问题时输入n或N,则应该删除标题,问题在于,当所有操作完成后,所有项目仍然存在,并且没有任何项目被移除… 问题答案: 以下代码将解决您的问题。您必须遍历列表的副本。您无法从要迭代的列表中删除项目。

  • 问题内容: 我刚刚开始使用Java中的列表。我想知道推荐的修改列表中每个元素的方法是什么? 我已经可以通过以下两种方法来完成此任务,但是它们看起来都相当简单。有没有更好的方法可以在Java中完成此操作?是否推荐以下任何一种方法,或者两者都处于同一水平? 问题答案: 第二个版本会更好。在内部,它们最后是相同的,但是第二个实际上允许您修改列表,而第一个将引发ConcurrentModification