【问题标题】:Python - Pop element from for loop and append to end, modifying list while loopingPython - 从 for 循环中弹出元素并追加到结尾,在循环时修改列表
【发布时间】:2017-10-23 20:34:27
【问题描述】:

对于 for 循环中的每个元素,我想检查元素是否满足某些条件。如果是,我想对它做点什么;如果没有,我想将它添加到列表的末尾并稍后再做。

我知道在循环时修改循环是不好的,但我还是想这样做,并且想知道如何正确地这样做。

for i in list:
    if something(i):
        do(i)
    else:
        #append to end of list, do later
        list.remove(i)
        list.append(i)

这段代码大部分都有效,但导致我在迭代时跳过删除 i 之后的元素。我该如何解决这个问题?

【问题讨论】:

  • 发布您的list 和edges
  • @RomanPerekhrest 我认为list 和edges 是同一个列表。
  • 哎呀,我的错,搞砸了泛型化

标签: python list for-loop iterator


【解决方案1】:

我很确定在循环遍历列表时没有正确的方法来修改列表。特别是,从列表中删除对象会导致问题(请参阅strange result when removing item from a list)。

我会考虑制作额外的列表,一份用于您的结果,一份用于您要处理的元素的临时列表。请注意,在我的示例中,tmp1 是您的输入列表。

tmp1 = [values to process]
tmp2 = []
results = []
while(tmp1)
    for i in tmp1:
        if something(i):
            results.append(i)
            do(i)
        else:
            tmp2.append(i)
    tmp1 = tmp2
    tmp2 = []

【讨论】:

    【解决方案2】:

    在询问我什至不需要删除之后才意识到,如果我只需要遍历列表一次 - 如果我只是追加,一旦其他所有内容完成,我就可以对元素进行操作.

    换句话说,这是可行的:

    for i in list:
        if something(i):
            do(i)
        else:
            #append to end of list, do later
            list.append(i)
    

    【讨论】:

    • 而且您不在乎您之前跳过的项目是否保留在列表中?
    • 内存会爆炸,为什么不呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2018-11-16
    • 2016-08-25
    • 1970-01-01
    • 2018-03-10
    • 2022-01-23
    相关资源
    最近更新 更多