使用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) –