如何使用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)]