Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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从for循环中删除列表中的所有对象?_Python - Fatal编程技术网

如何使用python从for循环中删除列表中的所有对象?

如何使用python从for循环中删除列表中的所有对象?,python,Python,我觉得这应该是一个相当简单的过程,但由于某些原因,我无法让它工作 目标:循环浏览对象列表,如果它们符合条件,则将其删除 问题:在需要从列表中删除所有对象之前,此操作一直有效。它不会删除最后一项 示例(通过相同的结果明显简化): 结果: MY ON SHIFT2 ['user1', 'user2', 'user3'] Index: 0 & Value: user1 Index: 1 & Value: user3 MY ON SHIFT2 ['user2'] 现在这里真正奇怪的部分

我觉得这应该是一个相当简单的过程,但由于某些原因,我无法让它工作

目标:循环浏览对象列表,如果它们符合条件,则将其删除

问题:在需要从列表中删除所有对象之前,此操作一直有效。它不会删除最后一项

示例(通过相同的结果明显简化):

结果:

MY ON SHIFT2 ['user1', 'user2', 'user3']
Index: 0 & Value: user1
Index: 1 & Value: user3
MY ON SHIFT2 ['user2']
现在这里真正奇怪的部分是,不管列表中有什么,它似乎总是保留中间项(即user2)。如果我将这些值更改为chicken、horse、dog,那么剩下的项目将是horse。我不确定这是否重要,但我想我会提出来的

此外,无论我选择哪种方法从列表中删除项(pop、remove或del),如果第三个(或最后一个)项都从“some_function()”返回true,则永远不会删除它们

此外,当在len(on_shift)上循环通过if条件时,从不等于1,它总是在2处停止。如果all从“some_fuction()”返回true,则永远不会到达第三个(或最后一个)对象,因此我删除列表的if语句永远不会发生

如果我打印循环的val而不从列表中删除任何内容,则所有3个名称都会显示。我一定是在做些傻事


想法?

在迭代列表时不应修改列表,但如果必须这样做,则需要复制列表并迭代副本,但要从原始列表中删除元素

def some_function(val):
    return True

on_shift2 = ['user1', 'user2', 'user3']

print("MY ON SHIFT2", on_shift2)

for idx, val in enumerate(on_shift2.copy()):  # copy here
    print(f"Index: {idx} & Value: {val}")
    check_user = some_function(val) # function to check if user is in list and if so return true
    if check_user:
        on_shift2.remove(val)  # delete in original
print("MY ON SHIFT2", on_shift2)
输出

MY ON SHIFT2 ['user1', 'user2', 'user3']
Index: 0 & Value: user1
Index: 1 & Value: user2
Index: 2 & Value: user3
MY ON SHIFT2 []
这实际上比较慢,一个更好的替代方法是


迭代时不应从列表中删除,如果必须这样做,则枚举中的idx、val的
值(on_shift2.copy())
复制然后删除if条件
if len(on_shift2)==1不再需要了。我收到了一个不同的错误:
NameError:name'on\u shift2'未定义
如果检查用户:
行,请尝试不使用
,然后查看发生了什么。我猜问题出在这一行,它有时返回false,并且不会删除所有项目。@phython_用户感谢您的快速回复。这就是我需要的。如果你想把这个作为答案,我会把它标记为正确的@David我在使用.copy()时遇到了这个错误,并且在
if len(on_shift2)
子句中删除列表时,代码保持不变。@Sudipto有时您所说的是真的,并且该部分工作正常,我只是不知道如何让它在100%正确时删除所有列表。这也是一个很好的替代解决方案!我将用这两种方法进行测试,看看性能是否存在问题,如果是,我将把“false”项移到一个新列表中,而不是复制。你可以让我知道基准测试结果,但只有当你的输入列表大于你现在的输入列表时,它才会被注意到,如我的回答I LinkedHanks所示!!!
MY ON SHIFT2 ['user1', 'user2', 'user3']
Index: 0 & Value: user1
Index: 1 & Value: user2
Index: 2 & Value: user3
MY ON SHIFT2 []
on_shift2_new = [i for i in on_shift2 if not some_function(i)]