gpt4 book ai didi

python - 从 python 列表中删除项目的问题

转载 作者:行者123 更新时间:2023-11-28 21:22:13 27 4
gpt4 key购买 nike

在下面的方法中,我组装了一个元组列表,同时尝试确保所有值都不小于零。下面的方法首先获取一个 block 并使用它以 1 的增量计算相邻 block 的坐标,然后继续删除其坐标小于零的 block 。我的问题出在第二阶段,因为如果我输入坐标为 (0,0) 的 block ,它不会删除两个坐标:(0,-1) 和 (-1,0)。

代码如下:

def get_block_neighbors(self, block):
neighbor_list = []
neighbor_list.append((block.x,block.y+1))
neighbor_list.append((block.x+1,block.y+1))
neighbor_list.append((block.x+1,block.y))
neighbor_list.append((block.x+1,block.y-1))
neighbor_list.append((block.x,block.y-1))
neighbor_list.append((block.x-1,block.y-1))
neighbor_list.append((block.x-1,block.y))
neighbor_list.append((block.x-1,block.y+1))

for item in neighbor_list: #each tuple item in the list
if item[0] < 0 or item[1] < 0:
print item
neighbor_list.remove(item)
print neighbor_list

get_block_neighbors(Block(Point(0,0),"green"))

我得到以下输出:

(1, -1)
(-1, -1)
(-1, 1)
[(0, 1), (1, 1), (1, 0), (0, -1), (-1, 0)]

在这里,前三行是我要删除的元组的打印输出,而最后一行是我组装的元组的列表。如您所见,最后两个元组的至少一个坐标具有负值。理想情况下,我想要这个:

(1, -1)
(-1, -1)
(-1, 1)
(0, -1)
(-1, 0)
[(0, 1), (1, 1), (1, 0)]

奇怪的是,当我删除/注释掉 neighbor_list.remove(item) 行时,我在某种意义上更接近我需要的位置,因为它的打印方法 - out 包括我要删除的两个元组。但当然,这样做的一个缺点是我不再从该列表中删除任何目标元组。

任何对此的帮助将不胜感激,我真的希望我的疏忽不是非常明显的事情。附带一提,我觉得应该有一种方法来组装这个列表,同时能够放弃删除阶段,这就是我在接受上面的代码之前开始编写这个方法的方式。谢谢!

最佳答案

问题是您在遍历该列表的同时从列表中删除项目。列表迭代按索引发生(在幕后),因此这不会像您预期的那样工作,因为当删除它们的前身时,会跳过某些值。

为避免此问题,您可以使用切片迭代列表的副本:

for item in neighbor_list[:]:

或者,更好的是,使用列表理解来构建新列表而不是修改旧列表:

new_list = [(x, y) for x, y in neighbor_list if x >= 0 and y >= 0]

关于python - 从 python 列表中删除项目的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19626978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com