我的 for 循环没有根据条件删除数组中的项目? Python [重复]

Posted

技术标签:

【中文标题】我的 for 循环没有根据条件删除数组中的项目? Python [重复]【英文标题】:My for loop isn't removing items in my array based on condition? Python [duplicate] 【发布时间】:2019-04-14 13:46:17 【问题描述】:

我有一个数组(移动)数组。我想遍历我的移动数组并为每个元素设置一个条件。条件是,如果元素中的任何一个数字为负数,那么我想从移动数组中删除该元素。循环没有正确删除我的项目。但是如果我通过完全相同的循环运行它两次,那么它将删除最后一个元素。这对我来说毫无意义。使用 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]]

有什么想法吗???

【问题讨论】:

不要同时迭代和修改你迭代的列表。 那么如何根据条件过滤列表? 在你的第二个例子中,什么都不会留下,因为所有元素都有一个内部元素 你的第一个例子也不会留下任何东西 - 因为所有元素都包含 1 个小于 0 的元素 @PatrickArtner 是的,我知道这是应该发生的,但正如您从输出中看到的那样,这不是正在发生的事情。这就是问题所在:) 【参考方案1】:

不要同时迭代和修改。

您可以使用列表组合或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 的概述中找到

【讨论】:

【参考方案2】:

您可以遍历列表的副本。这可以通过在你的 for 循环列表 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)

输出

[]

【讨论】:

以上是关于我的 for 循环没有根据条件删除数组中的项目? Python [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于删除数组项的嵌套 For 循环

js 数组循环删除元素或对象

根据一维数组中的值更改二维numpy数组中的某些值而无需for循环

在for循环中使用拼接从数组中删除项目[重复]

vue for循环的数据 根据条件判断是不是绑定事件

v-for循环出来的元素,实现鼠标放在当前元素,改变样式