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

sky*_*ork 35 python set python-2.7

我有一个集合myset,我有一个函数迭代它对它的项目执行一些操作,这个操作最终删除集合中的项目.

显然,我仍然无法继续迭代原始集合.但是,我可以这样做:

mylist = list(myset)
for item in mylist:
    # do sth
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法?

kir*_*off 20

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

myset = set([3,4,5,6,2])
while myset:
    myset.pop()
    print myset
Run Code Online (Sandbox Code Playgroud)

我添加了一个打印方法来提供这些输出

>>> 
set([3, 4, 5, 6])
set([4, 5, 6])
set([5, 6])
set([6])
set([])
Run Code Online (Sandbox Code Playgroud)

如果你想坚持你的选择列表,我建议你使用列表理解深度复制列表,并循环复制,同时从原始列表中删除项目.在我的例子中,我在每个循环中使原始列表的长度减少.

l = list(myset)
l_copy = [x for x in l]
for k in l_copy:
    l = l[1:]
    print l
Run Code Online (Sandbox Code Playgroud)

>>> 
[3, 4, 5, 6]
[4, 5, 6]
[5, 6]
[6]
[]
Run Code Online (Sandbox Code Playgroud)


Zer*_*eus 11

这应该工作:

while myset:
    item = myset.pop()
    # do something
Run Code Online (Sandbox Code Playgroud)

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

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

myset = set(filter(test, myset))
Run Code Online (Sandbox Code Playgroud)

  • 如果我只想从集合中删除所有内容,这很有效。就我而言,我需要掌握每个项目,并在**将其从集合中移除之前对其应用一个函数。 (2认同)
  • "迭代迭代时从迭代中移除项目是一个坏主意(糟糕的是,如果它解决了你正在做的事情,Python将引发异常" - 一种常见的误解,但不真实.对于某些迭代(基于散列表)具体而言,它是不合法的(注意:不是一个坏主意),当你尝试时,Python会通知你.对于其他的迭代,它是完全有效的,一旦你理解它是如何工作的,可预测的. (2认同)

Tha*_*ser 5

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

myset = set(range(1,5))
myset = filter(lambda x:x%2==0, myset)
print myset
Run Code Online (Sandbox Code Playgroud)

将返回

>>> [2, 4]
Run Code Online (Sandbox Code Playgroud)

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

  • 我不同意`lambda`总是会让您的生活更轻松……实际上,似乎通常并不会使您的生活更轻松。。。 (4认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)