【发布时间】:2018-09-21 11:12:58
【问题描述】:
我有一个 df1 有两列代表链接:
point_1 point_2
'A' 'B'
'B' 'C'
'C' 'D'
'D' 'E'
'D' 'F'
'M' 'N'
'N' 'O'
...
我还有另一个带有 point_A 和 end_point 的 df2(这是一个需要为该点中断三个的点),并且一些 point_A 可以有多个 end_point。
point_A end_point
'A' 'E'
'A' 'F'
'M' 'O'
...
我不太确定如何实现它,我使用了一些函数和以下方式: 首先我将 df1 转换为列表:
temp = []
for row in df1.iterrows():
index, data = row
temp.append(data.tolist())
final_list = [[s.encode('ascii') for s in list] for list in temp]
现在的功能:
def all_paths(table, root):
children = {}
for node, child in table:
if child:
children[node] = children.setdefault(node, []) + [child]
def recurse(path):
yield path
if path[-1] in children:
for child in children[path[-1]]:
for foo in recurse(path + [child]):
yield foo
return recurse([root])
path_list = []
for el in d:
for i in el:
for path in all_paths(final_list, i):
path_list.append(path)
我得到了这个: 路径列表:
[['A'],
['A', 'B'],
['A', 'B', 'C'],
['A', 'B', 'C', 'D'],
['A', 'B', 'C', 'D', 'E'],
['A', 'B', 'C', 'D', 'F']
['M'],
['M', 'N'],
['M', 'N', 'O']
...
]
如您所见,我有很多列表项,但我不需要它们,我只需要从 point_A 到 end_point 的所有点的项。因此,我现在的想法是将列表中每个项目的第一个元素与 point_A 进行比较,并将列表中同一项目中的列表元素与 end_point 进行比较。如果相等,则表示它是正确的。
期望的输出:
[
['A', 'B', 'C', 'D', 'E'],
['A', 'B', 'C', 'D', 'F']
['M', 'N', 'O']
...
]
我会在数据框中做得更好,但这也可以。
但我确信有更简单、更正确的解决方案。 欢迎任何帮助。
【问题讨论】:
-
那么你需要做的是:对于每个起点,获取一组终点。然后当你生成一个路径时,你检查它的终点是否在那个集合中,如果是的话,它就会被报告。
-
@DanD。好吧,我认为我们的想法是一样的,但可以肯定的是:我需要每个起点从起点到终点的所有点。这些点的列表将代表路径。每个起点只有一个终点,但在我的数据集中,它是 left_side-right_side 链接形式。也许这就是令人困惑的原因
标签: python list recursion tree topology