【发布时间】:2017-08-24 22:30:01
【问题描述】:
我有一个列表列表,我正在寻找类似于组合或排列的内容,但有些条件可能会导致良好的“路径”或“死角”。如果是“Dead_End”,它应该索引到列表中的下一个选项。 示例:
AList = [[1, 2, 3],
[2, 0, 3],
[3, 1, 0],
[1, 0, 2]]
N = 0
Index = 0
#AList[N][Index]=1, AList[2][2]=0
我想从值 AList[N][Index] 开始,它一开始是 [0][0],因此等于 1,然后将其分配给 N。在 N 分配为 1 之后,我们永远无法走回到那个 List 和 Path = [1]。
然后我会得到 AList[N][Index],它是 AList[1][0],等于 2。将其分配给 N。Path.append(N),我会得到 Path = [1, 2 ].
AList[N][Index] 接下来将等于 3,N = 3,Path 将变为 [1, 2, 3]
现在 AList[N][Index] 将等于 1。这将是一个 Dead_Path 并且不是一个好的解决方案,因为 1 已经在 Path 中,我们无法返回它。所以我想索引到列表中的下一个选择。 Index = Index + 1。这将导致 AList[N][Index] = 0. Path = [1, 2, 3, 0]
这是一条好路径,有许多好路径和许多死角。例如,另一个好的路径是 Path = [1, 0, 2, 3]。
这是一个多嵌套的 IF、For、While 循环场景,还是有一个 itertools 函数来测试所有的 Paths 和 Dead_Ends?并且列表的列表可能更复杂且不统一以创建更多的 Dead_Ends,例如:
BList = [[1, 4, 3],
[2, 0, 3, 4],
[3, 4, 0],
[1, 2],
[3, 2, 1, 0]]
编辑: 我无法处理所有的 Dead_Ends。所有的循环和索引都让我感到困惑,所以我认为最好的解决方案是我使用 itertools 并列出所有路径组合并允许重新访问前一个节点。然后我会使用 set() 函数来消除重新访问节点的列表。最后,我只剩下 Perfect_Paths 击中每个节点一次。我不知道这是否是最快/最干净的,但它有效。代码如下:
Perfect_Path = list()
i = 0
All_Paths = list(itertools.product(*Alist))
for i in range(len(All_Paths)):
if len(set(All_Paths[i])) == len(Alist): #filter out paths that revisited a node, which means it would have same number repeated in list
Perfect_Path.append(All_Paths[i])
print ("The perfect paths are ", Perfect_Path)
编辑:我上面的代码适用于一个小的 Alist,但是对于一个稍大的列表的 itertools 所有组合,比如说 10 个数据节点突然变成了数百万个路径。然后我必须 set() 它们来消除选择。回到我的绘图板上。
【问题讨论】:
-
您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在发布者已经尝试自己解决问题时才提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码(形成minimal reproducible example)、示例输入(如果有的话)、预期输出和您实际获得的输出(输出、回溯、等等。)。您提供的详细信息越多,您可能收到的答案就越多。检查tour 和How to Ask。
-
专门解决您的最后一个问题:有很多方法可以做到这一点,但在您发布尝试之前,不太可能有人会帮助您。这就像学习任何类型的数学:首先你用困难的方式做它,然后他们教你捷径......以你知道的方式尝试你的手,然后有人可能会告诉你一个更快的技巧。
-
明白。在询问捷径之前,我将在今晚晚些时候先发布我一直在尝试的漫长道路。
标签: python list loops indexing itertools