2013-05-18 76 views
2

我想在迭代集合的同時刪除其中的 個項目。有類似的問題deleting one item at the timelists,但他們做 不適用於我的情況。在迭代時修改集合

代碼如下;我遍歷了一個 集合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) 
+0

因爲ZN中**對於i在ZN ** **是集(範圍(N))** .. – matzone

+0

可能的[刪除從一組得到控制而重複的項e迭代它](http://stackoverflow.com/questions/16551334/delete-items-from-a-set-while-iterating-over-it) –

回答

1

使用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 -= 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)代替,並保持價值你」的一組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 
+0

謝謝!複製粘貼您的建議代碼給了我: '語法錯誤: Cosets.append(list(tmp))' – geo909

+0

@ geo909:什麼版本的Python?我使用了集合理解,它只在Python 2.7和Python 3.x中可用。 –

+0

說實話,我正在使用鼠標(「筆記本」瀏覽器界面,通過我的瀏覽器訪問我的大學聖人),你基本上是在Python中用額外的數學庫進行編碼(我猜,我對編碼和這是相當新的)。我可以看到,sage版本是4.3(2009年12月),但在它的生命週期中,我找不到通過筆記本界面獲取python版本的方法。另一個說明,我改變了一下代碼,以便它適用於我,我會更新我的問題.. – geo909