2017-04-15 25 views
1

所以我有一塊是把兩個詞到數據庫從大名單代碼,然後同時刪除這些詞語從列表中,這樣既不被再次使用。當列表幾乎結束時,它會傳遞給一個不相關的函數。衝突列表中清除的時候,不應該有

def db_add(words): 
    for i in words: 
     choice = randint(2, 9) 
     if len(words) < choice: 
      finish(words) 
     else: 
      cursor.execute(
       'INSERT INTO swaps (word1, word2) VALUES (%s, %s);', (i, words[choice]) 
      ) 
      conn.commit() 
      words.remove(words[choice]) 
      words.remove(i) 

現在,由於無法從列表中刪除i,此操作失敗 - 通常會提前。使用一些打印語句,我發現這種情況發生在iwords[choice]最終成爲相同的單詞時發生。但是,因爲選擇從來沒有0,我不明白如何iwords[choice]永遠是平等的。

我唯一的猜測是,它有事情做,在使用過程中操縱名單語句,或者這是一個非常愚蠢的錯誤,我做的,但我真的不知道。

+0

可能是問題的一部分,至少是該'cursor.execute'參數應該是' 'INSERT INTO互換(WORD1,單詞2)VALUES(%S,%S);' %(我,單詞[選擇]'? – martineau

回答

1

要修改的列表,你迭代它。這不可避免地導致問題。如果您需要從列表中刪除元素,建議您複製列表,從副本中刪除單詞,然後返回副本。

def db_add(words): 
    words_copy = words.copy() 
    for i in words: 
     choice = randint(2, 9) 
     if len(words) < choice: 
      finish(words) 
     else: 
      cursor.execute(
       'INSERT INTO swaps (word1, word2) VALUES (%s, %s);', (i, words[choice]) 
      ) 
      conn.commit() 
      words_copy.remove(words_copy[choice]) 
      words_copy.remove(i) 
+0

謝謝,似乎它會工作的大部分。但任何想法如何繼續飼養複製列表回到循環?我不能繼續使用起始單詞列表因爲我不能在數據庫中有兩個相同的單詞,我很肯定遞歸會在> 300,000個單詞列表上達到最大限制。 –