python更改列表的值

时间:2016-10-07 17:14:54

标签: python list graph

我是Python的新手,所以请耐心等待,这可能很简单。我正在尝试构建图的邻接列表表示。在这个特定的表示中,我决定使用列表列表,其中每个子列表的第一个值表示尾节点,所有其他值表示头节点。例如,边1->2, 2->3, 3->1, 1->3的图表将表示为[[1,2,3],[2,3],[3,1]]

在此边缘列表上运行以下代码会出现我不明白的问题。

边缘列表(Example.txt):

1 2
2 3
3 1
3 4
5 4
6 4
8 6
6 7
7 8

守则:

def adjacency_list(graph):

graph_copy = graph[:]
g_tmp = []
nodes = []
for arc in graph_copy:

    choice_flag_1 = arc[0] not in nodes
    choice_flag_2 = arc[1] not in nodes
    if choice_flag_1:
        g_tmp.append(arc)
        nodes.append(arc[0])
    else:
        idx = [item[0] for item in g_tmp].index(arc[0])
        g_tmp[idx].append(arc[1])

    if choice_flag_2:
        g_tmp.append([arc[1]])
        nodes.append(arc[1])

return g_tmp


# Read input from file
g = []
with open('Example.txt') as f:
    for line in f:
        line_split = line.split()
        new_line = []
        for element in line_split:
            new_line.append(int(element))
        g.append(new_line)
print('File Read. There are: %i items.' % len(g))
graph = adjacency_list(g)

在运行时,当代码处理弧6 7(文件中的第二行到最后一行)时,以下行(在else语句中找到)追加7 g_tmp ,但graph_copygraph

idx = [item[0] for item in g_tmp].index(arc[0])
g_tmp[idx].append(arc[1])

发生了什么事?

谢谢!

Ĵ

P.S。我正在运行Python 3.5

P.P.S。我还尝试用graph_copy = graph[:]替换graph_copy = list(graph)。同样的行为。

1 个答案:

答案 0 :(得分:1)

问题出在

   if choice_flag_1:
       g_tmp.append(arc)

当您附加弧时,您将附加内部列表的浅表副本。替换为新的列表

   if choice_flag_1:
      g_tmp.append([arc[0],arc[1]])