2014-09-04 76 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