Python插入列表

时间:2013-12-10 01:51:42

标签: python

我遇到了问题。在python中我有一个函数,它应该打印最长的路径。如果我使用[[1,2,3,4,5][1,2,3,4,5]]之类的列表,但是如果我使用像[x] for x in range(5)]*2这样的列表,或者像这样的任何其他列表,则该函数有效。 (我不知道在python中调用了什么,但是如果我有像[vale] *那样的列表),则代码不起作用。 所以,我的问题是,如何在没有任何参考的情况下制作新的清单。 Deepcopy或[:]不起作用,因为列表中的引用仍然存在。但我不知道如何在没有引用的情况下复制值。 :) 谢谢。

def naj_narascajoca(vrtek):


    visina = len(vrtek)
    sirina = len(vrtek[0])

    vrt = []
    vrt.append([-1]*(sirina+2))
    for greda in vrtek:
        greda.insert(0,-1)
        greda.append(-1)
        vrt.append(greda)

    vrt.append([-1]*(sirina+2))


    for i in vrt:
        print(i)


    pot = ""
    maximal = 0
    je_vecja = True
    x = 1
    y = 1
    max_odlocitev = 0
    while je_vecja == True:

        print("--------------",vrt[x][y],"-----------------")

        vre_left = vrt[x][y-1]
        vre_right = vrt[x][y+1]
        vre_up = vrt[x-1][y]
        vre_down = vrt[x+1][y]
        sez = sorted([vre_down,vre_left, vre_right, vre_up])
        for i in sez:
            if i > maximal:
                max_odlocitev = i;
                break
        #max_odlocitev = max(vrt[x][y-1],vrt[x][y+1], vrt[x+1][y], vrt[x-1][y])
        if maximal < max_odlocitev:
                maximal = max_odlocitev
                if vrt[x][y-1] == maximal:
                    pot += "L"
                    y -=1
                elif vrt[x][y+1] == maximal:
                    pot += "R"
                    y+=1
                elif vrt[x+1][y] == maximal:
                    pot += "D"
                    x+=1
                elif vrt[x-1][y] == maximal:
                    pot += "U"
                    x-=1


        else:
            je_vecja = False

    print(pot)

vrt = [[1,3,3,8,5,4,2,1,5,6],
    [2,4,3,3,6,8,1,3,5,6],
    [4,5,6,4,7,4,3,6,4,7],
    [2,8,7,0,0,7,4,7,8,0],
    [2,3,4,7,0,8,7,6,3,8],
    [3,7,9,0,8,5,3,2,3,4],
    [1,5,7,7,6,4,2,3,5,6],
    [0,6,3,3,6,8,0,6,7,7],
    [0,1,3,2,8,0,0,0,0,0],
    [3,1,0,3,6,7,0,5,3,1],
    [1,3,5,7,0,8,6,5,3,1],
    [3,6,3,1,3,5,8,7,5,1],
    [4,3,6,0,0,8,4,7,5,3],
    [3,5,6,8,6,3,1,3,5,2]]

#naj_narascajoca(vrt)
naj_narascajoca([[x] for x in range(5)]*2)

2 个答案:

答案 0 :(得分:1)

像这样:

[any mutable objects] * 2

...显式地对每个可变对象进行两次引用。使用the FAQ中解释的相同解决方案,创建原始列表并不重要,它是同一个问题:您必须两次定义列表。所以,而不是:

[[x] for x in range(5)]*2

......这样做:

[[x] for _ in range(2) for x in range(5)]

deepcopy似乎不起作用的原因是你(大概)使用它是这样的:

copy.deepcopy([[x] for x in range(5)]*2)

deepcopy比你想象的要聪明。它将2个引用结构的深层副本复制到5个列表的相同列表中。因此,您最终得到5个新列表,5个列表的新列表,以及2个新列表的新引用。

可以做你想做的事。您只需要在将两个副本放在一起之前复制列表:

>>> a = [[x] for x in range(5)]
>>> b = [copy.deepcopy(a), copy.deepcopy(a)]
>>> # or [copy.deepcopy(a) for _ in range(2)]
>>> b[0] is b[1]
False
>>> b[0][0] is b[1][0]
False

或者,映射两个引用列表上的副本,因此它们各自被单独复制:

>>> b = [copy.deepcopy(x) for x in a*2]
>>> b[0][0] is b[1][0]
False

答案 1 :(得分:0)

当您在列表中使用*2时,您没有像您发现的那样复制列表 - 您正在对完全相同的列表进行两次引用。您可以使用其他级别的列表理解来获得所需的内容。

[[[x] for x in range(5)] for y in range(2)]

或许问题是当你想要一个列表1-5时,你在内部部分得到一个列表列表:

[list(range(1, 6)) for x in range(2)]