2017-10-13 60 views
-1

此代碼用於在一個簡單的列表上完美運行,但由於我一直試圖在數據庫上運行它,因此在我的double for循環中出現StopIteration錯誤。 編輯:現在我的問題是我只是沒有得到任何類型的錯誤,命令行是空的,當我運行它。當我在數據庫而不是簡單列表上試用時,爲什麼我的代碼不能在Visual Studio上運行?

這裏是我的代碼:

# -*- coding: utf-8 -*- 
import pyodbc 
import re 
from difflib import SequenceMatcher 

[x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')] 

# Connection to accdb 

conn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' 
    r'DBQ=C:\\Users\\alice\\Desktop\\lexique3.accdb;' 
    ) 
cnxn = pyodbc.connect(conn_str) 
crsr = cnxn.cursor() 

# Put all words into a list 

crsr.execute("select unites_lexicales from Mot where cat_grammat='Verbe' or 'Nom' or 'Adjectif' or 'Adverbe'") 
resultat = crsr.fetchall() 
words = [row[0] for row in resultat] 
#print(words) 

# Remove unwanted characters and put radicals into a list 

radicals = [] 
motifp = "^(an|re|dé|dés)" 
motifs = "(ist|man|er|an|able|asyon)$" 

for word in words : 
    word = re.sub(motifp, '', word) 
    word = re.sub(motifs, '', word) 
    radicals.append(word) 
#print(radicals) 

# Match radicals and put words into new lists 

ratio = 0.6 
n = len(radicals) 
result = [] 
used_js = [] 

for i in range(n) : 
    if i in used_js: 
     continue 
    matches = [words[i]] 
    js = (x for x in range(n) if x != i and x not in used_js) 
    for j in js : # Previous error : StopIteration 
     if SequenceMatcher(None, radicals[i], radicals[j]).ratio() >= ratio : 
      matches.append(words[j]) 
      used_js.append(j) 
    result.append(matches) 
print(result) 

預期的結果如下(我以前用一個簡單的列表了):

['flore', 'fleur', 'fleuriste'], ['remaniement', 'remanier', 'manier', 'maniable'], ['désaimer', 'aimer', 'aimant'], ['mêler', 'emmêler', 'désemmêler'] 

已經分別嘗試了代碼的每一部分,一切正常除了for循環之外,還有其他優點 關於爲什麼我不能運行它以及我如何解決這個問題的任何線索都會非常有幫助。 非常感謝!

+0

你可以發佈一個堆棧跟蹤? –

+0

@LaurentLAPORTE如果使用print_stack()的方式工作,則在運行時不會顯示任何內容。 –

+0

@LaurentLAPORTE Visual Studio告訴我絕對沒有錯誤,但代碼仍然不會運行。 –

回答

0

你有StopIteration因爲:

(x for x in range(n) if x != i and x not in used_js) 

是一個迭代器,它產生沒有任何項目。換句話說,列表[x for x in range(n) if x != i and x not in used_js]是空的。

你應該使用一個經典for循環:

for j in range(n): 
    if j != i and j not in used_js: 
     if SequenceMatcher(None, radicals[i], radicals[j]).ratio() >= ratio : 
      matches.append(words[j]) 
      used_js.append(j) 

您還可以通過列表取代你發生器表達式,像這樣:

js = [x for x in range(n) if x != i and x not in used_js] 
for j in js: 
    if SequenceMatcher(None, radicals[i], radicals[j]).ratio() >= ratio : 
     matches.append(words[j]) 
     used_js.append(j) 
+2

雖然,迭代器不產生任何項目應該只執行0次迭代。 for循環應該處理StopIteration。 – user2357112

+1

在耗盡的迭代器上使用for循環不會拋出'StopIteration' –

+0

您是對的,需要深入研究 –

相關問題