奇数列表和索引行为

时间:2014-09-04 13:40:00

标签: python list function range

我试图写一个简单的脚本来在一个单词列表中结合动词。 我有一个像这样的列表列表:

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

1 个答案:

答案 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