python - 如何同时迭代和修改列表,集等

时间:2016-07-30 19:24:26

标签: python

在我的程序中,我有很多行,我需要迭代在同一个for循环中修改它。

但是,我知道修改你正在迭代的东西是不好的,因为可能 - 可能 - 导致不希望的结果。

所以我一直在做这样的事情:

for el_idx, el in enumerate(theList):
    if theList[el_idx].IsSomething() is True:
        theList[el_idx].SetIt(False)

这是最好的方法吗?

3 个答案:

答案 0 :(得分:1)

这是一个概念上的误解。

从迭代中修改列表本身是危险的,因为Python将循环转换为较低级别的代码。这可能会在迭代过程中产生意想不到的副作用,这里有一个很好的例子:

https://unspecified.wordpress.com/2009/02/12/thou-shalt-not-modify-a-list-during-iteration/

但是修改存储在列表中的可变对象是可以接受的,也是常见的做法。

我怀疑您是否认为因为列表由这些对象组成,修改这些对象会修改列表。这是可以理解的 - 它不是通常的想法。如果有帮助,请考虑该列表仅包含对这些对象的引用。当您修改循环中的对象时 - 您只是使用列表来修改对象,而不是修改列表本身。

您不应该做的是在迭代期间从列表中添加或删除项目。

答案 1 :(得分:0)

我的问题似乎不清楚。但是如果我们在Python中的for循环迭代期间讨论修改列表的有害问题。我可以考虑两种情况。

首先,您修改列表中的一些元素,这些元素假设在下一轮计算中用作其原始值。

e.g。你想编写一个具有这些输入和输出的程序。

输入:

[1, 2, 3, 4]

预期产出:

[1, 3, 6, 10] #[1, 1 + 2, 1 + 2 + 3, 1 + 2 + 3 + 4]

但是......你用这种方式编写代码:

#!/usr/bin/env python

mylist = [1, 2, 3, 4]

for idx, n in enumerate(mylist):
    mylist[idx] = sum(mylist[:idx + 1])
print mylist

结果是:

[1, 3, 7, 15] # undesired result

第二次,您在for循环迭代期间对列表大小进行了一些更改。

e.g。来自python-delete-all-entries-of-a-value-in-list

>>> s=[1,4,1,4,1,4,1,1,0,1]
>>> for i in s:
...   if i ==1: s.remove(i)
... 
>>> s
[4, 4, 4, 0, 1]

该示例显示了在列表中更改大小的副作用引起的不良结果。这显然表明,for Python中的每个循环都无法以正确的方式处理动态大小的列表。下面,我将向您展示一些解决此问题的简单方法:

  #!/usr/bin/env python

  s=[1, 4, 1, 4, 1, 4, 1, 1, 0, 1]
  list_size=len(s)
  i=0

  while i!=list_size:
      if s[i]==1:
          del s[i]
          list_size=len(s)
      else:
          i=i + 1

  print s

结果:

[4, 4, 4, 0]

结论:在循环迭代期间修改列表中的任何元素绝对没有害处,如果你不1)改变列表的大小2)制作一些你自己计算的副作用。

答案 2 :(得分:-1)

你可以先获得索引

// But this does...
childCtrl.test = $scope.parentCtrl.test;