2017-04-15 2 views
1

Also habe ich ein Stück Code, der zwei Wörter in eine Datenbank aus einer großen Liste legt, und dann beide Wörter aus der Liste entfernt, so dass keiner wieder verwendet wird. Wenn die Liste fast zu Ende ist, wird sie an eine nicht verwandte Funktion übergeben.Kollisionen in Listenentfernungen, wenn es nicht sein sollte

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) 

Nun, dies fehlschlägt: in der Regel früh wegen nicht in der Lage zu sein i aus der Liste zu entfernen. Mit einigen Druckanweisungen fand ich, dass dies passierte, wenn i und words[choice] irgendwie die gleichen Wörter sind. Aber da die Wahl nie 0 ist, sehe ich nicht, wie i und words[choice] jemals gleich sein können.

Meine einzige Vermutung ist, dass es etwas mit der Manipulation von Listen während der Verwendung in Anweisungen zu tun hat, oder es ist ein wirklich dummer Fehler, den ich mache, aber ich habe wirklich keine Ahnung.

+0

Könnte ein Teil des Problems zumindest sein, dass das 'cursor.execute' Argument' 'INSERT INTO swaps (word1, word2) WERTE (% s,% s); ' % (i, words [choice] '? – martineau

Antwort

1

Sie ändern die Liste, während Sie darüber iterieren. Dies führt unweigerlich zu Problemen. Wenn Sie Elemente aus der Liste entfernen müssen, empfiehlt es sich, eine Kopie der Liste zu erstellen, Wörter aus der Kopie zu entfernen und dann die Kopie zurückzugeben.

+0

Danke, es scheint, als würde es größtenteils funktionieren. Aber jede Idee, wie man die kopierte Liste wieder in die Schleife füttert? Ich kann die Startwortliste nicht weiter verwenden weil ich nicht zwei gleiche Wörter in der DB haben kann, ich bin mir ziemlich sicher, dass die Rekursion bei einer Wortliste von> 300.000 Wörtern ein maximales Limit erreichen wird. –

Verwandte Themen