我有一个 set myset
,并且我有一个函数可以对其进行迭代以对其项目执行一些操作,并且此操作最终会从集合中删除该项目。
显然,我不能在迭代原始集合的同时做到这一点。但是,我可以这样做:
mylist = list(myset)
for item in mylist:
# do sth
有没有更好的办法?
我有一个 set myset
,并且我有一个函数可以对其进行迭代以对其项目执行一些操作,并且此操作最终会从集合中删除该项目。
显然,我不能在迭代原始集合的同时做到这一点。但是,我可以这样做:
mylist = list(myset)
for item in mylist:
# do sth
有没有更好的办法?
首先,使用一套,就像零比雷埃夫斯告诉我们的那样,你可以
myset = set([3,4,5,6,2])
while myset:
myset.pop()
print(myset)
我添加了一个print
提供这些输出的方法
>>>
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]
[]
这应该有效:
while myset:
item = myset.pop()
# do something
或者,如果您需要有条件地删除项目:
def test(item):
return item != "foo" # or whatever
myset = set(filter(test, myset))
让我们在修改当前集合时返回所有偶数。
myset = set(range(1,5))
myset = filter(lambda x:x%2==0, myset)
print myset
将返回
>>> [2, 4]
如果有机会使用总是使用 lambda
它将使您的生活更轻松。
另一种方法可能是:
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)
使用copy
库制作集合的副本,迭代副本并从原始副本中删除。如果您想坚持for
循环并且只想迭代一个元素一次 - 如果您不一定要删除所有元素,则可以派上用场。
import copy
for item in copy.copy(myset):
myset.remove(item)