gpt4 book ai didi

python - 如何循环遍历集合,同时从 Python 3 中的集合中删除项目

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:02 26 4
gpt4 key购买 nike

这是我的情况:

我有一个 list/set(哪个无关紧要)movieplayer 对象,我想调用一个 “preload” 函数在。此预加载函数可以立即返回,但希望在将来返回一点。

我要存储这个movieplayer的集合,说明还没有预加载,然后循环遍历,调用preload函数。 preload 函数在返回时会将它们从集合中移除(因此我会知道它们何时都已预加载)。

但是,我认为因为 python 正在等待 preload 函数,然后删除播放器,所以我得到了一个 set size changed during iteration 错误

嘿,这是我的代码的简化版本,我希望能找到解决此问题的方法。

a = set([mp1, mp2 mp3])
for player in a:
preload(player)

# preload would be something like
def preload(player):
player.preloadVideo()
a.remove(player)
# This is where I believe the error gets generated.

我能想到的唯一解决方案是制作一个 set acopy,然后遍历它,但我不确定这是否是正确的方法或什至会起作用。

最佳答案

您可以通过迭代集合的副本来修复它。我在这里使用了 list():

a = set(['mp1', 'mp2', 'mp3'])

# preload would be something like
def preload(player):
player.preloadVideo()
a.remove(player)

for player in list(a):
preload(player) # N.B. pass player, not a

然而,这并不是一个好的设计。一方面,全局变量 a 是从 preload() 函数中引用的。此外,for 循环遍历集合中的所有元素,依次将每个元素传递给 preload(),因此没有必要检查 中每个 player 的成员资格一个。最后,preload() 应该执行预加载播放器所需的一切,但它不应该负责维护外部数据结构 (a)。

更好的设计是让 preload() 返回一个 bool 值,指示预加载是否成功。然后可以在预加载函数之外删除成功加载的播放器:

a = set(['mp1', 'mp2', 'mp3'])

# preload would be something like
def preload(player):
return player.preloadVideo() # assume that this returns boolean

for player in list(a):
if preload(player):
a.remove(player)

if len(a):
print "{} player(s) failed to preload: {}".format(len(a), a)
else:
print "All players successfully preloaded"

此代码只会在成功预加载后删除播放器。

关于python - 如何循环遍历集合,同时从 Python 3 中的集合中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31448465/

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