使用函数之间的集合/列表(python)

时间:2018-01-06 17:38:26

标签: python list nested-lists

当我在函数之间使用集合时,我对程序的行为感到困惑。

我有一些修改嵌套列表的函数:list1。

想象一下,我有一个3x9数组,位置(0,0)有一个set = {6},其余的单元格是{1,2,3,4,5,6}

def eliminateUnique(list1, (0,0), rowColBoxLocations)获取一个值集,即{6},并从同一行,同一列和相同的3x3框中的所有集中弹出

现在,当我运行代码时,它会从所有行和列中删除{6},并且数组会更新。

现在我的问题是,当这个函数更新数组时,如果没有返回list1,(我不能在上面的参数中使用全局list1),我怎么得到将list1数组更新到另一个函数中?

因此,如果我调用def solve(list1),并调用(list1, (0,0), rowColBoxLocations),如何将新list1返回到solve函数,以便我可以进一步处理它?我认为我的消除功能不是更新并将数组传递给我的solve函数。

def main()
    list1=[[6, 0, 0, 0, 0, 0, 0, 6, 7], [3, 0, 0, 5, 7, 0, 0, 0, 9], 
          [1, 2, 0, 8, 6, 0, 0, 0, 3]]
    convertToSets(list1)
    eliminateUnique(list1,location, listOflocations)


def convertToSets(list1):
    s = set(range(1, 10))
    list1 = [[{j} if j!=0 else s for j in i] for i in list1]
    return list1

def eliminateUnique(list1, location, listOfLocations):
    count =0
    locVal = list1[location[0]][location[1]]
    if len(locVal)==1:
        lvint = list(locVal)[0] #integer value of number in set.
    for i in listOfLocations:
        if (lvint in list1[i[0]][i[1]]) and (i!=location):
            list1[i[0]][i[1]].remove(lvint)

def solve(list1) - here's where i'm having problems!

添加了一些代码人员。主要运行,呼叫convertToSets。 0-> {1到9},然后将其传递给eliminateUniques,这就是我开始遇到问题的地方。在传递集合时,eliminateUnique没有做它应该做的事情。当我手动将数组放入函数内部时,看起来很好。我想这可能与我如何使用套装有关。

2 个答案:

答案 0 :(得分:0)

在评论中指出列表是可变的。函数eliminateUniques()的工作方式通过索引值修改列表中的项目来利用它。

convertToSets()不会以这种方式工作的原因是您没有修改列表,而是创建一个新列表并将其分配给与传入的参数同名的本地变量list1。可以使用原始列表解析创建临时list2然后执行list1.clear()以清空原始列表,然后迭代list2并通过索引将其复制到list1,例如:list1 [0] = list2 [0]但实际上是&# 39;浪费大量工作而不是按原样使用函数的返回值。所以在main中你会做list1 = convertToSets(list1)

答案 1 :(得分:0)

在这里创建新的局部变量list1并将其返回:

def convertToSets(list1):
    s = set(range(1, 10))
    list1 = [[{j} if j!=0 else s for j in i] for i in list1]
    return list1

但您不使用返回的值,convertToSets(list1)对外部list1无效:

def main()
    list1=[[6, 0, 0, 0, 0, 0, 0, 6, 7], [3, 0, 0, 5, 7, 0, 0, 0, 9], 
          [1, 2, 0, 8, 6, 0, 0, 0, 3]]
    convertToSets(list1)
    eliminateUnique(list1,location, listOflocations)

将您的代码更改为:

def main()
    list1=[[6, 0, 0, 0, 0, 0, 0, 6, 7], [3, 0, 0, 5, 7, 0, 0, 0, 9], 
          [1, 2, 0, 8, 6, 0, 0, 0, 3]]
    list1 = convertToSets(list1)
    eliminateUnique(list1,location, listOflocations)

重要的部分是:

    list1 = convertToSets(list1)

这会将返回的值分配回名称list1,并在eliminateUnique(list1, location, listOflocations)中使用此新列表。