我正试着写一个简单的脚本,让动词在单词列表中变位。 我有这样一个列表:
expressions = [[['battre', 'verb', 'inf', True], ['froid', 'adj', 'ms', 'False']], [['prendre', 'verb', 'inf', True], ['froid', 'adj', 'ms', False]]]
“True”表示它是可变的,“False”表示它不应该改变。 对于这个列表的每个列表中的每个元素,我找到带有“verb”标记的元素,并构建一个匹配的flexions列表。例如,对于表达式“battre froid”,我将取“battre”,并建立一个包含该动词的所有法语屈曲的列表。我会得到这样的结果
verbs = ['bat', 'bats', 'battons'..].
我接下来要做的是,对于一个给定的表达式,比如“battre froid”,建立一个列表,列出这个表达式的所有可能的变形,比如“bats froid”,“battons froid”,等等。 我应该会有这样的结局
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
出于某种模糊的原因,事情是这样的: 所有动词将替换为动词列表中的最后一个屈曲。 但是,也就是说,只有在从函数中调用这一位代码时。 在执行过程中打印时,我可以准确地看到我想要的内容。但最后,我得到了一些不同的东西。 更大的问题是,我检查了循环,在函数中执行这些代码行之前和执行期间检查了数据,一切正常。 我甚至在打印完数据后从终端复制粘贴了函数中的数据,并在脚本末尾(函数外)重新添加了相同的代码位(“for I in range part”),得到了我想要的结果。你知道吗
它似乎只有在从函数内部执行时才会失败。我已经在这上面呆了两天了,比较列表,复制粘贴,移动代码,检查类型,报告,打印。。。我只是不明白为什么它在函数中会这样。不幸的是,我在这个函数中需要它。。。你知道吗
下面是代码,其中expr\u listFormat与“expressions”相同,flexDict是一个flexions字典(key是一个基,value是基的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循环)?你知道吗
当我在最后一个for循环之前打印resList和verbFlex,复制粘贴它们,并在外部重做范围位时,它工作得很好。。。我不明白
非常感谢,很抱歉发了这么长的帖子,我尽量做到准确和清晰!你知道吗
干杯
查塔姆
我会把我的评论放在一个答案里,这样更容易解析。我没有测试过它,因为我不能;不知道你的输入变量到底是什么。所以这是一些猜测工作。你知道吗
你说:“只有当这段代码是从函数中调用的”, 这让我想到你改变了函数中的数组,但没有意义。 最后的一段代码显示您正在返回一个列表,因此您可能不想更改原来的列表。你知道吗
让我们看看函数的代码:
不!你不做拷贝,而是按原样插入
expr_listFormat
。它是作为函数参数之一的变量。你知道吗在这里你改变它:
resList[i]
是expr_listFormat
,所以你实际上在做expr_listFormat[idx] = verbFlex[i]
。您现在已经更改了expr_listFormat
。你知道吗为了避免这种情况,最简单的方法是在调用函数时传递一个副本:
或更改函数代码中的行
相关问题 更多 >
编程相关推荐