我正在嘗試編寫一個簡單的腳本來將動詞連接到單詞列表中。 我有這樣一個名單列表的列表:奇怪的列表和索引行爲
expressions = [[['battre', 'verb', 'inf', True], ['froid', 'adj', 'ms', 'False']], [['prendre', 'verb', 'inf', True], ['froid', 'adj', 'ms', False]]]
「真」意味着它的變量,而「假」意味着它shoudn't改變。 對於列表中每個列表中的每個元素,我找到標籤爲「verb」的元素,並構建一個匹配的flexions列表。例如,對於表達式「battre froid」,我將採用「battre」,並用動詞的所有法語動詞建立一個列表。我會的東西落得像
verbs = ['bat', 'bats', 'battons'..].
我想做的事未來,對於一個給定的表達式,如「battre弗羅伊德」,建立這個表達式的所有可能的flexions的列表,如「蝙蝠弗羅伊德」 「battons弗羅伊德」等 那麼我應該用什麼落得像
res = [[['battons', 'verb', '3pPres'], ['froid', 'adj', 'ms']], ['bats', 'v', '2sPres'],['froid', 'adj', 'ms]]]
看,我的問題是不是建築本身,它是關於結果來改變不同的地方我把它。我似乎無法確定它爲什麼會有不同的表現。
我要做的未來是這樣的:
idx = 0 (position in the list of the verb in one expression, here 0)
for i in range(len(verbs)):
expressions[i][idx] = verbs[i] ## replacing infinitive form by conjugated one
return res
而對於一些模糊的原因,這是發生了什麼: 所有動詞用在動詞列表中找到最後的屈曲所取代。 但是,也就是說,只有當這個位的代碼是從一個函數內調用的。 在執行過程中打印時,我確切地看到了我想要的。但最後,我得到了不同的東西。 更大的問題是,我檢查了循環,在函數的這些代碼行的執行期間,我檢查了數據,這一切都很好。 我甚至在打印完終端函數後,從終端複製粘貼了數據,並在腳本末尾重新添加了相同位數的代碼(「我在範圍內」),我想要的東西
它似乎只在一個函數內完成時失敗。我一直堅持這兩天,比較列表,複製粘貼,移動代碼,檢查類型,repr,打印.. 。我只是不明白爲什麼它在函數內部以這種方式表現,而且我需要它在這個函數中很不幸...
這裏是代碼,其中expr_listFormat與「表達式」相同,而flexDict是一個flexions字典(鍵是基數,數值是基數的折點):
編輯在原有代碼:
def createVariants(expr_listFormat, flexDict):
for sublist in expr_listFormat:
if sublist[3] and sublist[1] == "v":
verbFlex = [] ## list of flexions, each flexion being a tuple like ('bats', 'v', '2s')
resList = [] ## list of copies of the expression
for flexion in flexDict[sublist[0]]:
resList.append(expr_listFormat) ## making a copy of the original for each flexion
verbFlex.append(flexion) ## list of flexions
for i in range(len(verbFlex)):
resList[i][idx] = verbFlex[i]
return resList
沒有人有任何想法,爲什麼這不工作(或者更準確地說,爲什麼它的唯一的工作的功能之外,直到最後的循環函數內部) ?
在我之前的最後一個for循環打印resList和verbFlex,將其複製粘貼,和重做範圍外一點,它工作得很好......我不明白這一點:(
非常感謝,並且對於這篇長文章感到抱歉,我儘可能地精確和清晰。
乾杯
Xhattam
是'expr_listFormat'的名單列表字符串或列表的字符串列表? 'flexDict'究竟是什麼?你能提供一個代碼和輸入數據的[minimal example](http://stackoverflow.com/help/mcve)嗎?請注意,'resList.append(expr_listFormat)'**不會**,無論評論可能聲稱,做一個副本。 – jonrsharpe 2014-09-04 13:45:12
是否正確縮進了您的最後一個代碼段(我的意思是:它與原始代碼中的縮進完全相同)? – 2014-09-04 13:46:20
在你最後一段代碼中,看起來你的第二個循環錯過了縮進。 (像@ bruno-desthuilliers建議) – abrunet 2014-09-04 14:21:12