【问题标题】:Modification of the list items in the loop (python) [duplicate]修改循环中的列表项(python)[重复]
【发布时间】:2011-03-11 13:49:34
【问题描述】:

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

有没有办法解决这个问题?

【问题讨论】:

    标签: python loops items


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      试试这个:

      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 中的每一项,对其应用函数,并自动从结果中构造一个新列表,所以你不必担心将@987654337 的结果放入@ 在列表中的正确位置。您的原始示例实际上可以表示为

      data = ["everything" for item in data]
      

      【讨论】:

      • 它看起来有点奇怪(或解决方法),但它可以正常工作。我不知道必须为最重要的项目(在列表中)提供它们的 ID。谢谢。
      • @sigo:这实际上根本不是一种解决方法,它是完成此类任务的 100% 正确且完全正常的方法(但请注意我所说的关于列表理解的内容)。
      • 在这种特殊情况下,列表解析可以被更快的data = ["everything"] * len(data)替换。
      • 关于内存消耗和列表解析的旁注:这将需要(暂时)内存来存储旧的data 和新的data。因此,对于大型列表,索引修改可能更可取。
      【解决方案3】:

      列表项通过整数索引访问,即。 e.在您的示例中data[1] == 'example'。这就是当您使用字符串作为查找时 Python 会报错的原因。

      如果你想通过它的值在列表中找到一个元素,你可以使用data.index("value")

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

      但如果您只是想遍历它们,请按照 David 的建议使用 enumerate()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        • 2017-08-06
        相关资源
        最近更新 更多