简体   繁体   English

从列表中有条件地删除项目,并从Python循环开始进行迭代

[英]Conditional removal of items from list and iterate from beginning through Python loop

I am trying to remove items from my list when a condition is true and then iterate again from the very beginning of the list. 当条件为真时,我试图从列表中删除项目,然后从列表的开头再次进行迭代。 Following is my code: 以下是我的代码:

from random import randint
x = [1,2,3,4,5]

for item in x:
    print("item is " + str(item))
    z = randint(1, 5)
    print("z is " + str(z))
    if z == item:
        x[:] = [item for item in x if item != z]
        print("Remaining list is " + str(x))
    else:
        print("Remaining list is " + str(x))

So for example, my first item in the x list is 1 and lets say z is also 1. When z == item ,my x list removes the first item(1) and gets updated to [2,3,4,5]. 因此,例如,我在x列表中的第一个项目是1,而z也是1。当z == item ,我的x列表删除了第一个项目(1)并更新为[2,3,4,5] 。 But I get the following output: 但是我得到以下输出:

item is 1
z is 1
Remaining list is [2, 3, 4, 5]
item is 3
z is 2
Remaining list is [2, 3, 4, 5]

Instead of restarting the loop from 2 in my recently updated list[2,3,4,5], the loop starts from the second position which is 3. How do I restart the loop from the very beginning everytime my list gets updated? 而不是从我最近更新的列表[2,3,4,5]中的2重新开始循环,而是从第二个位置3开始循环。如何在列表每次更新时从头开始重新开始循环? Thanks! 谢谢!

You can add a while loop outside of your for loop, and restart the for loop whenever you remove an item. 您可以在for循环之外添加一个while循环,并在删除项目时重新启动for循环。

from random import randint
x = [1,2,3,4,5]

restart = True

while restart:
    restart = False
    for item in x:
        print("item is " + str(item))
        z = randint(1, 5)
        print("z is " + str(z))
        if z == item:
            x[:] = [item for item in x if item != z]
            print("Remaining list is " + str(x))
            restart = True
            break
        else:
            print("Remaining list is " + str(x))

# results
item is 1
z is 2
Remaining list is [1, 2, 3, 4, 5]
item is 2
z is 2
Remaining list is [1, 3, 4, 5]
item is 1
z is 1
Remaining list is [3, 4, 5]
item is 3
z is 4
Remaining list is [3, 4, 5]
item is 4
z is 3
Remaining list is [3, 4, 5]
item is 5
z is 5
Remaining list is [3, 4]
item is 3
z is 4
Remaining list is [3, 4]
item is 4
z is 1
Remaining list is [3, 4]

For loops doesn't work the way you're expecting them to be, better is if you can use while with conditional check like following : For循环无法像您期望的那样工作,更好的是,如果可以while使用条件检查,例如:

from random import randint
    x = [1, 2, 3, 4, 5]
    loops = 0
    while loops<len(x):
        item = x[loops]
        print("item is " + str(item))
        z = randint(1, 5)
        print("z is " + str(z))
        if z == item:
            x[:] = [item for item in x if item != z]
            print("Remaining list is " + str(x))
            continue
        else:
            print("Remaining list is " + str(x))
        loops += 1

Output : 输出:

item is 1
z is 1
Remaining list is [2, 3, 4, 5]
item is 2
z is 2
Remaining list is [3, 4, 5]
item is 3
z is 1
Remaining list is [3, 4, 5]
item is 4
z is 2
Remaining list is [3, 4, 5]
item is 5
z is 1
Remaining list is [3, 4, 5]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM