Python:遵循 "path" 个元组?
Python: follow a "path" of tuples?
短版:
我有:
2 元组的列表,例如 [("a", "b"), ("b", "c"), ("d", "e"), ("c", "d"), ("f", "g")]
不一定按字母顺序排列
我想要的:
给出一个起始字母(比如 "a")和一个结束字母(比如 "e"),我希望 Python 从上面的列表中找到可用的二元组列表 "link" 开始字母到结束字母,因此在本例中,该列表将按 (a --> b --> c --> d --> e)
的顺序 [("a", "b"), ("b", "c"), ("c", "d"), ("d", "e")]
更长的版本:
大家好,这是我在 SO 上的第一个 post,虽然我已经浏览了很长时间并且总能在这里找到我的答案,很棒的社区!
我的工作需要做一些数据分析,我有一定数量的数据集(为了简单起见,我在这里用字母表示),我只知道数学上的区别:("a" - "b"), ("b" - "c"), 等等(这些是我的输入)。我将用 2 元组表示这些输入。思路是计算数据集"a"和"e"之间的差异,即"a" - "e",在这种情况下可以通过对一些中间数据集求和来获得差异(我的输入):("a" - "b")+("b" - "c")+("c" - "d")+("d" - "e") = "a" - "e".
我想知道是否有一个 Python 模块已经可以满足我的需求,或者是否有使用 Python 语法的简单方法。在上面的简单情况下,每个字母只出现在列表中的 2 个元组中,但在一般情况下,可能会有一个额外的元组包含正确的字母,但不允许 link 开始字母到结束字母(例如,如果有一个额外的元组 ("b", "h"),它将在代码的第一次迭代中与元组 ("b", "c"),但它应该被丢弃,因为字母 "h" 没有 "lead" 任何地方)。我在处理这种情况时遇到了麻烦。
希望问题够清楚,很难用简单的语言表达。
提前致谢!
看起来这里的方法是使用一些图形分析工具来找到一对节点之间的 shortest path。尽管这种情况实际上在某种程度上简化了问题,但由于您提到 每个字母仅出现在列表中的 2 个元组中,这意味着只有一条路径连接一对节点。虽然常见的情况是有多条可能的路径连接源节点和目标节点,在这种情况下,我们需要一些算法来找到其中最短的路径。
所以解决这个问题的方法是在一对 source
和 target
节点之间使用 NetworkX to build a graph, having the list of tuples represent the edges of the graph, and look for the nx.shortest_path
:
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
将只寻找连接源节点和目标节点所需的最小图边。
短版:
我有:
2 元组的列表,例如 [("a", "b"), ("b", "c"), ("d", "e"), ("c", "d"), ("f", "g")]
不一定按字母顺序排列
我想要的:
给出一个起始字母(比如 "a")和一个结束字母(比如 "e"),我希望 Python 从上面的列表中找到可用的二元组列表 "link" 开始字母到结束字母,因此在本例中,该列表将按 (a --> b --> c --> d --> e)
[("a", "b"), ("b", "c"), ("c", "d"), ("d", "e")]
更长的版本: 大家好,这是我在 SO 上的第一个 post,虽然我已经浏览了很长时间并且总能在这里找到我的答案,很棒的社区!
我的工作需要做一些数据分析,我有一定数量的数据集(为了简单起见,我在这里用字母表示),我只知道数学上的区别:("a" - "b"), ("b" - "c"), 等等(这些是我的输入)。我将用 2 元组表示这些输入。思路是计算数据集"a"和"e"之间的差异,即"a" - "e",在这种情况下可以通过对一些中间数据集求和来获得差异(我的输入):("a" - "b")+("b" - "c")+("c" - "d")+("d" - "e") = "a" - "e".
我想知道是否有一个 Python 模块已经可以满足我的需求,或者是否有使用 Python 语法的简单方法。在上面的简单情况下,每个字母只出现在列表中的 2 个元组中,但在一般情况下,可能会有一个额外的元组包含正确的字母,但不允许 link 开始字母到结束字母(例如,如果有一个额外的元组 ("b", "h"),它将在代码的第一次迭代中与元组 ("b", "c"),但它应该被丢弃,因为字母 "h" 没有 "lead" 任何地方)。我在处理这种情况时遇到了麻烦。
希望问题够清楚,很难用简单的语言表达。
提前致谢!
看起来这里的方法是使用一些图形分析工具来找到一对节点之间的 shortest path。尽管这种情况实际上在某种程度上简化了问题,但由于您提到 每个字母仅出现在列表中的 2 个元组中,这意味着只有一条路径连接一对节点。虽然常见的情况是有多条可能的路径连接源节点和目标节点,在这种情况下,我们需要一些算法来找到其中最短的路径。
所以解决这个问题的方法是在一对 source
和 target
节点之间使用 NetworkX to build a graph, having the list of tuples represent the edges of the graph, and look for the nx.shortest_path
:
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
将只寻找连接源节点和目标节点所需的最小图边。