奇数表和索引行为

2024-10-02 12:35:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着写一个简单的脚本,让动词在单词列表中变位。 我有这样一个列表:

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,复制粘贴它们,并在外部重做范围位时,它工作得很好。。。我不明白

非常感谢,很抱歉发了这么长的帖子,我尽量做到准确和清晰!你知道吗

干杯

查塔姆


Tags: of函数代码in列表for动词ms
1条回答
网友
1楼 · 发布于 2024-10-02 12:35:54

我会把我的评论放在一个答案里,这样更容易解析。我没有测试过它,因为我不能;不知道你的输入变量到底是什么。所以这是一些猜测工作。你知道吗

你说:“只有当这段代码是从函数中调用的”, 这让我想到你改变了函数中的数组,但没有意义。 最后的一段代码显示您正在返回一个列表,因此您可能不想更改原来的列表。你知道吗

让我们看看函数的代码:

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

相关问题 更多 >

    热门问题