Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从列表中有条件地删除项,并通过Python循环从头开始迭代_Python_Python 3.x_Loops_For Loop_While Loop - Fatal编程技术网

从列表中有条件地删除项,并通过Python循环从头开始迭代

从列表中有条件地删除项,并通过Python循环从头开始迭代,python,python-3.x,loops,for-loop,while-loop,Python,Python 3.x,Loops,For Loop,While Loop,当条件为true时,我尝试从列表中删除项目,然后从列表的最开始处再次迭代。以下是我的代码: 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

当条件为true时,我尝试从列表中删除项目,然后从列表的最开始处再次迭代。以下是我的代码:

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))
例如,我在
x
列表中的第一项是1,假设z也是1。当
z==item
时,我的
x
列表将删除第一项(1),并更新为[2,3,4,5]。但我得到以下输出:

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]
不是从我最近更新的列表[2,3,4,5]中的2重新启动循环,而是从第二个位置3开始循环。每次更新列表时,如何从一开始就重新启动循环?
谢谢

您可以在
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
循环之外添加
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
循环的工作方式与您期望的不一样,如果您可以在使用条件检查时使用
更好,如下所示:

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

For
循环的工作方式与您期望的不一样,如果您可以在使用条件检查时使用
更好,如下所示:

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

在迭代列表时更改列表的大小将导致一系列的off-by-one错误。相反,构建一个新的列表,然后在循环结束时替换旧的列表。在迭代列表时更改列表的大小将导致一系列错误。相反,构建一个新列表,然后在循环结束时替换旧列表。谢谢您的回答!谢谢你的回答!谢谢你的回答!谢谢你的回答!