gpt4 book ai didi

python - 在遍历列表时如何有效地删除元素?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:40 24 4
gpt4 key购买 nike

我正在使用 Python 制作一个简单的进化模拟器。

有一个名为 engine.All 的列表,它存储了单位/动物和食物。我遍历它,如果遇到一只动物,我会再次遍历它以查看他是否与任何食物 block 发生碰撞。

如果是这样,那么我会增加他的能量,将食物标记为已吃掉,并将其添加到 toRemove 列表中,稍后我将使用该列表从 engine.All< 中删除元素.

这是代码,但是删除了所有多余的东西:

def remove(l, who): #This should remove all the elements contained in who from the list l
offset = 0

for i in who:
l.pop(i + offset)
offset -= 1

return l


for ob in engine.All:
if ob.skip:
continue;

if ob.drawable:
ob.draw()

if isinstance(ob, Flatlander): #If it is an animal
#Do speed stuff
ob.energy -= decay #Lower its energy

for i in range(len(engine.All)): #Iterate through the list again
if collides(ob.pos, ob.r, engine.All[i].pos, engine.All[i].r) and isinstance(engine.All[i], Food) and ob.energy + engine.All[i].r < ob.r**2*3.14 and not engine.All[i].skip: #If it collides with a food piece, the food piece isn't about to be deleted and it can take the energy in (their maximum is defined by their radiuses)
ob.energy += engine.All[i].r #Increase the his energy
toRemove.append(i) #Add the food piece to the toRemove list
engine.All[i].skip = True #Flag it as skipped

if ob.energy < 0 and not ob.skip: #If its energy is 0 and if it isn't already about to be deleted
toRemove.append(engine.All.index(ob)) #Add it to the toRemove list
ob.skip = True #Flag it as skipped


engine.All = remove(engine.All, toRemove)

我几乎可以肯定这行不通,而且有更好的方法。我如此确定的原因是,有时候,我看到屏幕上的东西只是“闪烁”——突然消失又出现。此外,似乎还有“幽灵”动物(在代码中称为 Flatlanders),我得出这个结论是因为有时食物 block 会永久消失。

请推荐一种更有效的方法。

最佳答案

作为生成器函数执行此操作并产生您确实想要的结果,而不是弹出您不想要的元素会更容易。

def valid_engines():
for ob in engine.All:
if should_use_engine(ob):
yield ob

engines_to_use = valid_engines()

should_use_engine() 当然会被上面的逻辑替换,以确定是否包含引擎。

关于python - 在遍历列表时如何有效地删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10542792/

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