2014-09-04 169 views
1

我正在嘗試編寫一個簡單的腳本來將動詞連接​​到單詞列表中。 我有這樣一個名單列表的列表:奇怪的列表和索引行爲

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

+2

是'expr_listFormat'的名單列表字符串或列表的字符串列表? 'flexDict'究竟是什麼?你能提供一個代碼和輸入數據的[minimal example](http://stackoverflow.com/help/mcve)嗎?請注意,'resList.append(expr_listFormat)'**不會**,無論評論可能聲稱,做一個副本。 – jonrsharpe 2014-09-04 13:45:12

+2

是否正確縮進了您的最後一個代碼段(我的意思是:它與原始代碼中的縮進完全相同)? – 2014-09-04 13:46:20

+0

在你最後一段代碼中,看起來你的第二個循環錯過了縮進。 (像@ bruno-desthuilliers建議) – abrunet 2014-09-04 14:21:12

回答

0

我會把我的意見在回答中,所以這是一個有點容易解析。我沒有測試過,因爲我不能;不知道你的輸入變量究竟是什麼。所以這是一些猜測工作。

你說:「只有當這個位的代碼是從一個函數內調用時,」 這導致我認爲你改變函數內的數組,而沒有意義。 你最後一段代碼顯示你正在返回一個列表,所以你可能不想改變原來的列表。

讓我們看看該函數的代碼:

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 

沒有!您不需要複製,您按原樣插入expr_listFormat。你把哪個變量作爲函數的參數之一。

  verbFlex.append(flexion) ## list of flexions 
     for i in range(len(verbFlex)): 
      resList[i][idx] = verbFlex[i] 

在這裏,你改變它:resList[i]expr_listFormat,所以你實際上在做expr_listFormat[idx] = verbFlex[i]。你現在已經改變了expr_listFormat

爲了避免這種情況,最簡單的是通過調用函數時副本:

createVariants(inputList[:], inputdict) 

或者更改線路的功能代碼

resList.append(expr_listFormat[:]) ## making a copy of the original for each flexion