My for loop isn't removing items in my array based on condition? Python
本问题已经有最佳答案,请猛点这里访问。
我有一个数组(移动)的数组。我想遍历moves数组并为每个元素设置一个条件。条件是,如果元素中的任何一个数字为负数,那么我想从moves数组中删除该元素。循环无法正确删除我的项目。但如果我将它运行两次完全相同的循环,那么它将删除最后一个元素。这对我来说毫无意义。使用python 3.6
1 2 3 4 | moves = [[3,-1],[4,-1],[5,-1]] for move in moves: if move[0] < 0 or move[1] < 0: moves.remove(move) |
如果运行此代码,则移动以结果[[4,-1]结尾但是,如果再次通过完全相同的for循环运行此结果,则结果为[]
我也尝试过用更多的元素来做这个,但这并不是因为某些原因而抓住某些元素。这是带有.remove()的bug吗?这就是我所尝试的…(在这篇文章中,我尝试检测非负数,以确定这是否是问题的一部分,但事实并非如此)
1 2 3 4 | moves = [[3,1],[4,1],[5,1],[3,1],[4,1],[5,1],[3,1],[4,1],[5,1]] for move in moves: if move[0] < 2 or move [1] < 2: moves.remove(move) |
上述代码的结果是
1 | moves = [[4, 1], [3, 1], [4, 1], [5, 1]] |
有什么主意吗????
您可以遍历列表的副本。这可以通过在for循环列表中添加
输入
1 2 3 4 5 6 | moves = [[3,-1],[4,-1],[5,-11], [2,-2]] for move in moves[:]: if (move[0] < 0) or (move[1] < 0): moves.remove(move) print(moves) |
产量
1 | [] |
不要同时迭代和修改。
您可以使用list comp或
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | moves = [[3,1],[4,-1],[5,1],[3,-1],[4,1],[5,-1],[3,1],[-4,1],[-5,1]] # keep all values of which all inner values are > 0 f = [x for x in moves if all(e>0 for e in x)] # same with filter() k = list(filter(lambda x:all(e>0 for e in x), moves)) # as normal loop keep = [] for n in moves: if n[0]>0 and n[1]>0: keep.append(n) print(keep) print(f) # f == k == keep |
输出:
1 | [[3, 1], [5, 1], [4, 1], [3, 1]] |
有关