45

我有一个 set myset,并且我有一个函数可以对其进行迭代以对其项目执行一些操作,并且此操作最终会从集合中删除该项目。

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

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

有没有更好的办法?

4

5 回答 5

28

首先,使用一套,就像零比雷埃夫斯告诉我们的那样,你可以

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]
[]
于 2013-05-14T19:42:57.680 回答
13

这应该有效:

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

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

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

myset = set(filter(test, myset))
于 2013-05-14T19:33:54.343 回答
8

让我们在修改当前集合时返回所有偶数。

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

将返回

>>> [2, 4]

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

于 2013-05-15T10:24:22.400 回答
5

另一种方法可能是:

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)
于 2016-08-09T18:19:06.770 回答
1

使用copy库制作集合的副本,迭代副本并从原始副本中删除。如果您想坚持for循环并且只想迭代一个元素一次 - 如果您不一定要删除所有元素,则可以派上用场。

import copy
for item in copy.copy(myset):
    myset.remove(item)
于 2020-01-24T07:55:03.773 回答