【问题标题】:Create recursive topology tree with Python使用 Python 创建递归拓扑树
【发布时间】: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


【解决方案1】:
point_A  end_point
  'A'        'E'
  'A'        'F'
  'M'        'O'

这个想法是你拿这张表并创建:

points = {'A':set(['E','F']), 'M':set(['O'])}

然后你循环这个:

for start_point, end_points in points.items():
    for path in all_paths(final_list, start_point, end_points):

然后在all_paths函数中:

替换

yield path

与:

if path[-1] in end_points:
   yield path

此测试会导致任何未在给定点之一结束的路径都不会被报告。

您可以通过查找链接的连接组件然后确保仅在同一组件中具有起点和终点的对的路径被枚举来加快这一速度。

【讨论】:

  • 感谢您帮助我。在 df1 中,您可以看到 A 通过 B、C 和 D 与 E 和 F 相连。所以在输出中我需要所有这些。实际上,对于 A,我需要两个输出集,一个是 B、C、D 和 E,另一个是 B、C、D、F。df2 只是用于检查结束是否正常。
猜你喜欢
  • 2018-12-29
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
相关资源
最近更新 更多