Skip to main content
 首页 » 编程设计

python之在遍历集合时修改集合

2025年05月04日22del

我想在删除时迭代一个集合 从它的项目。 deleting one item at the time也有类似的问题或 lists , 但他们确实 不适用于我的情况。

代码如下;我迭代了一个 设置 ZN 并在迭代结束时删除一个 几个项目(属于集合 temp 的项目)。但是 迭代仍在“原始”ZN 上发生。

如何修改此代码以更改设置的 ZN,同时 我正在迭代它?

def CyclotomicCosets(q,n): 
    N=q^n-1 
    ZN=set(range(N)) 
    Cosets=[] 
    for i in ZN: 
        tmp=set([]) 
        for j in range(n): 
            tmp.add( i*(q^j) %N) 
        Cosets.append(list(tmp)) 
        ZN=ZN.difference(tmp) # <------------ Does not do what I want 
    return(Cosets) 

请您参考如下方法:

使用 while 循环和 .pop() 值从集合中处理:

def CyclotomicCosets(q, n): 
    N = q ^ n - 1 
    ZN = set(range(N)) 
    Cosets = [] 
    while ZN: 
        i = ZN.pop() 
        tmp = {i * (q ^ j) % N for j in range(n)} 
        Cosets.append(list(tmp)) 
        ZN -= tmp 
    return Cosets 

请注意,我用集合理解替换了您的内部 for 循环,以使其更快、更紧凑。这些是在 Python 2.7 和 Python 3 中引入的,在早期版本的 Python 中,您可以改用生成器表达式:

tmp = set(i * (q ^ j) % N for j in range(n)) 

您最初的错误是替换 ZN 而不是更新它:

ZN=ZN.difference(tmp) 

这并没有改变您在 for 循环中使用的原始集合。相反,您正在创建一个新 集合并将 ZN 引用指向它。

但是,您不能在遍历 set 的同时对其进行修改,因此即使是就地差异也不会起作用;您将不得不使用 ZN -= tmp 或 ZN.difference_update(tmp) 但这会导致异常:

>>> ZN = set(range(3)) 
>>> for i in ZN: 
...     ZN -= set([2]) 
...  
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
RuntimeError: Set changed size during iteration 

更正后的代码给出:

>>> CyclotomicCosets(3, 5) 
[[0], [0, 1, 2, 3], [0, 1, 4, 5], [0, 4, 5, 6]] 

或者,循环遍历 range(N),并保留一组您已经处理过的值:

def CyclotomicCosets(q, n): 
    N = q ^ n - 1 
    Cosets = [] 
    seen = set() 
    for i in range(N): 
        if i in seen: continue 
        tmp = {i * (q ^ j) % N for j in range(n)} 
        Cosets.append(list(tmp)) 
        seen |= tmp 
    return Cosets