2017-04-15 8 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]이 어떻게 든 같은 단어가 될 때 이런 일이 벌어지고 있음을 발견했습니다. 그러나 choice가 0이 아니기 때문에, 나는 iwords[choice]이 어떻게 평등 할 수 있는지 보지 못합니다.

나의 유일한 추측은 for 문에서 사용하는 동안 목록을 조작하는 것과 관련이 있거나 실제로 만드는 바보 같은 실수입니다. 그러나 나는 정말로 모른다.

+0

"cursor.execute"인수가''INSERT INTO swaps (word1, word2) VALUES (% s, % s); 여야합니다. % (i, words [choice]'? – 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

고맙습니다. 대부분의 부분에서 효과가있는 것처럼 보입니다. 그러나 복사 된 목록을 루프에 계속 공급하는 방법을 생각해보십시오. 시작 단어 목록을 계속 사용할 수 없습니다. 왜냐하면 나는 DB에서 같은 단어를 2 개 가질 수 없기 때문에 재귀가 300,000 개 이상의 단어 목록에 최대 한도에 도달 할 것이라고 확신합니다. –

관련 문제