我试图写一个简单的脚本来在一个单词列表中结合动词。 我有一个像这样的列表列表:
expressions = [[['battre', 'verb', 'inf', True], ['froid', 'adj', 'ms', 'False']], [['prendre', 'verb', 'inf', True], ['froid', 'adj', 'ms', False]]]
"真"意味着它的变量," False"意味着它没有改变。 对于此列表的每个列表中的每个元素,我找到带有标记"动词"的元素,并构建匹配的屈曲列表。例如,对于表达式" battre froid",我将采用" battre",并构建一个包含动词的所有法国屈曲的列表。我最终会得到像
这样的东西verbs = ['bat', 'bats', 'battons'..].
我接下来要做的是,对于一个给定的表达式,例如" battre froid",建立一个列表,列出该表达式的所有可能的弯曲,例如" bats froid",& #34; 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
由于一些不明原因,这是发生的事情: 所有动词都替换为动词列表中的最后一个屈曲。 但是,只有当从函数内调用这段代码时才会这样做。 在执行期间打印时,我看到了我想要的确切内容。但最后,我得到了一些不同的东西。 更大的问题是,我检查了循环,我在BEFORE中正确检查了数据,并且在函数中执行这些代码行时,它们都很好。 我打印后,甚至从我的终端复制粘贴功能中的数据,并在我的脚本末尾(函数外)重新编写相同的代码(" for i in range部分),然后我得到了我想要的。
从函数中完成时似乎只会失败。我已经坚持了两天,比较列表,复制粘贴,移动代码,检查类型,重新打印,打印......我只是不知道它为什么这样做在一个函数内部。不幸的是,我在这个功能中需要它......
这里是代码,其中expr_listFormat与"表达式"相同,而flexDict是一个flexions字典(key是基础,值是基础的屈曲):
编辑原始代码:
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时,复制粘贴它们,并重做外面的范围位,它工作得很好......我不明白:(
非常感谢,对于这篇长篇文章感到抱歉,我想尽可能精确和清晰!
干杯
Xhattam
答案 0 :(得分: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