使用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)
代替,并保持价值你”的一组VE已经处理:
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
因为ZN中**对于i在ZN ** **是集(范围(N))** .. – matzone
可能的[删除从一组得到控制而重复的项e迭代它](http://stackoverflow.com/questions/16551334/delete-items-from-a-set-while-iterating-over-it) –