我有一个myset
集,我有一个函数迭代它以对其项执行某些操作,此操作最终会从集中删除该项。
显然,在迭代原始集合时我不能这样做。但是,我可以这样做:
mylist = list(myset)
for item in mylist:
# do sth
还有更好的方法吗?
答案 0 :(得分:19)
首先,使用一套,如比雷埃夫斯告诉我们的那样,你可以
myset = set([3,4,5,6,2])
while myset:
myset.pop()
print myset
我添加了一个提供这些输出的打印方法
>>>
set([3, 4, 5, 6])
set([4, 5, 6])
set([5, 6])
set([6])
set([])
如果你想坚持你的选择列表,我建议你使用列表理解深度复制列表,并循环复制,同时从原始列表中删除项目。在我的例子中,我在每个循环中使原始列表的长度减少。
l = list(myset)
l_copy = [x for x in l]
for k in l_copy:
l = l[1:]
print l
给出
>>>
[3, 4, 5, 6]
[4, 5, 6]
[5, 6]
[6]
[]
答案 1 :(得分:10)
这应该有效:
while myset:
item = myset.pop()
# do something
或者,如果您需要有条件地删除项目:
def test(item):
return item != "foo" # or whatever
myset = set(filter(test, myset))
答案 2 :(得分:5)
在修改当前设置时,让我们返回所有偶数。
myset = set(range(1,5))
myset = filter(lambda x:x%2==0, myset)
print myset
将返回
>>> [2, 4]
如果有机会使用始终使用 lambda
,它会让您的生活更轻松。
答案 3 :(得分:2)
另一种方式可能是:
s=set()
s.add(1)
s.add(2)
s.add(3)
s.add(4)
while len(s)>0:
v=next(iter(s))
s.remove(v)
答案 4 :(得分:0)
使用copy
库制作该集合的副本,遍历该副本,然后从原始副本中删除。如果您想坚持使用for
循环,并且只想一次迭代一个元素,那么在不必删除所有元素的情况下会派上用场。
import copy
for item in copy.copy(myset):
myset.remove(item)