从一组删除项目,而遍历它(delete items from a set while iterati

2019-09-03 04:50发布

我有一组myset ,和我有过它迭代执行其项目的部分操作的功能,该操作最终从集合中删除的项目。

很显然,我不能这样做,同时仍超过原设定迭代。 我可以,但是,这样做:

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

有没有更好的办法?

Answer 1:

首先,使用一组,作为零比雷埃夫斯告诉我们,你可以

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]
[]


Answer 2:

这应该工作:

while myset:
    item = myset.pop()
    # do something

或者,如果你需要有条件地删除项目:

def test(item):
    return item != "foo"  # or whatever

myset = set(filter(test, myset))


Answer 3:

让我们回到所有偶数而修改当前设置。

myset = set(range(1,5))
myset = filter(lambda x:x%2==0, myset)
print myset

将返回

>>> [2, 4]

如果有机会使用总是使用 lambda它会让你的生活更轻松。



Answer 4:

另一种方式可以是:

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)


文章来源: delete items from a set while iterating over it