我有一个列表列表(总共10个元素),我正在尝试计算图中的强连接组件的数量(但不必担心)。
这是我的列表的样子:
import keyboard
import logzero
import logging
from logzero import logger
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
logzero.logfile(dir_path+"/keys.csv")
recorded = keyboard.record(until='esc')
formatter = logging.Formatter('%(name)s - %(asctime)-15s - %(levelname)s: %(message)s')
logzero.formatter(formatter)
logger.info(recorded)
其中内部列表的第一个元素-是顶点编号one [9],第二个元素是第二个顶点[7]。
我的问题是,在递归调用中,我将一个列表附加到该函数之外。
df_reversed_back =[[9, 7],
[8, 9],
[7, 8],
[6, 9],
[6, 4],
[5, 6],
[4, 5],
[3, 5],
[3, 1],
[2, 3],
[1, 2]]
如您所见,我想将SSC附加到all_components。 结果必须为:all_components = [[7,8,9],[4,5,6],[1,2,3]]
但是最后我得到:all_components = [[],[],[]]
你能告诉我我哪里做错了吗?
答案 0 :(得分:1)
您的问题在这里:
all_components.append(SSC)
print('All_components is :',all_components)
SSC[:] = []
您将SSC
设为all_components
的元素,但立即将其清空。这将all_components
保留为包含空列表的列表。然后,您继续使用主列表(SSC)进行操作。您可以在输出中看到这一点:
SSC was: [1, 2]
SSC is: [1, 2, 3]
All_components is : [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
Second_vert: [1, 2]
Second_vert[0] == node: False
All_components was: [[], [], []]
All_components was: [[], [], []]
每个元素仅是对原始SSC
的引用:您将其视为三元组或者为空,或者为最后一个组成部分。
我怀疑您想要添加SSC
的快照(副本):
all_components.append(SSC[:])
print('All_components is :',all_components)
SSC[:] = []
输出:
...
All_components was: [[7, 8, 9], [4, 5, 6], [1, 2, 3]]
答案 1 :(得分:1)
这样做时,您正在破坏SSC
的内容:
all_components.append(SSC)
print('All_components is :',all_components)
SSC[:] = []
这实际上将对SSC
的引用添加到all_components
,然后擦除了全局变量指向的数组的内容。
也许更好的方法是在需要时通过将其作为函数的参数来创建新的SSC。
您可以将函数读取为:
def DFS_2_Path(graph,node, SSC=None):
if SSC == None:
SSC = []
然后,当您递归调用它时,使用以下命令将其传递到递归中:
DFS_2_Path(graph,second_vert[1], SSC)
这将允许每个递归路径获得其自己的SSC
数组,此外,您不需要全局变量。