我有一个数组(数组)。我想遍历我的moves数组并为每个元素设置一个条件。条件是,如果元素中的任何一个数字为负,那么我想从moves数组中删除该元素。循环无法正确删除我的物品。但是,如果我通过完全相同的循环运行两次,它将删除最后一个元素。这对我来说毫无意义。使用Python 3.6
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()的错误吗?这就是我尝试过的...(在此过程中,我尝试检测非负数以查看是否为问题的一部分,不是吗)
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)
上面的代码的结果是
moves = [[4, 1], [3, 1], [4, 1], [5, 1]]
任何想法?
答案 0 :(得分:3)
您可以遍历列表的副本。这可以通过在循环列表[:]
中添加moves[:]
来完成。
输入
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 :(得分:2)
不要同时进行迭代和修改。
您可以使用列表组合或filter()
来获取满足您需求的列表:
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
输出:
[[3, 1], [5, 1], [4, 1], [3, 1]]
filter()
和all()
的Doku可以在built in functions的概述中找到