【问题标题】:Python: follow a "path" of tuples?Python:遵循元组的“路径”?
【发布时间】:2020-04-30 13:34:04
【问题描述】:

短版: 我有什么: 2 元组列表,例如 [("a", "b"), ("b", "c"), ("d", "e"), ("c", "d"), ("f", "g")],不一定按字母顺序排列

我想要什么: 给出一个开始字母(比如“a”)和一个结束字母(比如“e”)我希望 Python 从上面的列表中找到可用的 2 元组列表,它将开始字母“链接”到结束字母,所以在这个例子中,该列表将是 [("a", "b"), ("b", "c"), ("c", "d"), ("d", "e")] 在该顺序 (a --> b --> c --> d --> e)

加长版: 大家好,这是我在 SO 上的第 1 篇文章,尽管我已经浏览了很长时间并且总是在这里找到我的答案,很棒的社区!

我的工作要做一些数据分析,并且我有一定数量的数据集(为简单起见,我将在这里用字母表示),我只知道其中的数学差异:(“a” - “b ")、("b" - "c") 等(这些是我的输入)。我将用 2 元组表示这些输入。这个想法是计算数据集“a”和“e”之间的差异,即“a” - “e”,在这种情况下可以通过对一些中间数据集差异(我的输入)求和来获得:(“ a" - "b") + ("b" - "c") + ("c" - "d") + ("d" - "e") = "a" - "e"。

我想知道是否有一个 Python 模块可以完成我想要的工作,或者是否有一种使用 Python 语法的简单方法可以做到这一点。在上面的简单情况下,每个字母仅出现在列表中的 2 个元组中,但在一般情况下,可能会有一个包含正确字母的额外元组,但不允许将开始字母链接到结束字母(例如如果有一个额外的元组(“b”,“h”),它将在代码的第一次迭代中与元组(“b”,“c”)一起找到,但它应该被丢弃,因为字母“h”不会“引导”任何地方)。我在处理此类情况时遇到了麻烦。

我希望问题足够清楚,很难用简单的话来表达。

提前致谢!

【问题讨论】:

    标签: python graph networkx graph-theory


    【解决方案1】:

    看起来这里的方法是使用一些图形分析工具来找到一对节点之间的shortest path。尽管这种情况实际上在某种程度上简化了问题,因为您提到每个字母只出现在列表中的 2 个元组上,这意味着只有一条路径连接一对节点。虽然常见的情况是有多个可能的路径连接源节点和目标节点,但在这种情况下,我们需要一些算法来找到其中最短的路径。

    因此解决此问题的一种方法是使用NetworkX 构建一个图,让元组列表代表图的,并在一对之间寻找nx.shortest_path sourcetarget 节点:

    import networkx as nx
    
    edges = [("a", "b"), ("b", "c"), ("d", "e"), ("c", "d"), ("f", "g")]
    
    G = nx.from_edgelist(edges)
    path_nodes = nx.shortest_path(G, 'a', 'e')
    # ['a', 'b', 'c', 'd', 'e']
    

    如果您希望输出为元组列表,您可以轻松做到:

    list(zip(path_nodes[:-1], path_nodes[1:]))
    # [('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e')]
    

    请注意,此处的顺序不是相关因素,感觉这基本上只是根据提供的边定义了一个图形,shortest_path 将只寻找连接源节点和目标节点所需的最小图形边。

    【讨论】:

    • 感谢您的快速答复!看起来很有用。由于我正在寻找元组列表,因此我可以简单地从shortest_path(即['a', 'b', 'c', 'd', 'e'])的输出中重新生成元组列表,其中[(res[i], res[i+1]) for i in range(len(res)-1)] 之类的东西res 是@987654334 的输出@?
    • 谢谢@tomerikoo
    猜你喜欢
    • 2012-07-10
    • 2016-03-18
    • 1970-01-01
    • 2015-04-21
    • 2015-11-29
    • 1970-01-01
    • 2019-02-22
    • 2013-02-26
    • 2019-07-27
    相关资源
    最近更新 更多