在i上迭代时修改集合

2024-06-17 10:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在删除时迭代一个集合 里面的东西。对于deleting one item at the timelists也有类似的问题,但确实存在 不适合我的案子。

代码如下;我在 设置ZN并在迭代结束时删除 项目很少(属于集合temp)。但是 迭代仍在“原始”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)

Tags: the代码infortimerangeitemone
1条回答
网友
1楼 · 发布于 2024-06-17 10:30:35

使用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循环,使它更快、更紧凑。这些是在Python2.7和Python3中引入的,在早期版本的Python中,您可以使用生成器表达式代替:

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

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

ZN=ZN.difference(tmp)

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

但是,在迭代过程中不能修改set,因此即使就地差异也不会起作用;您必须使用ZN -= tmpZN.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

相关问题 更多 >