在迭代它时从集合中删除项目

时间:2013-05-14 19:30:09

标签: python python-2.7 set

我有一个myset集,我有一个函数迭代它以对其项执行某些操作,此操作最终会从集中删除该项。

显然,在迭代原始集合时我不能这样做。但是,我可以这样做:

mylist = list(myset)
for item in mylist:
    # do sth

还有更好的方法吗?

5 个答案:

答案 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)