我是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_copy
和graph
。
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)
。同样的行为。
答案 0 :(得分:1)
问题出在
行 if choice_flag_1:
g_tmp.append(arc)
当您附加弧时,您将附加内部列表的浅表副本。替换为新的列表
if choice_flag_1:
g_tmp.append([arc[0],arc[1]])