如何在Python中加入链接以获得循环?

dom*_*nik 9 python reduce iterator functional-programming list

我有一个链接列表,想知道连接的路径/周期.

我的链接看起来像这样:

[[0, 3], [1, 0], [3, 1]]
Run Code Online (Sandbox Code Playgroud)

我希望答案是这样的循环(或任何其他匹配循环):

[0,3,1]
Run Code Online (Sandbox Code Playgroud)

因此,您获取第一个子列表的第一个元素,然后您获取第二个元素,并查找以此元素开头的下一个子列表,然后重新开始.

有一种优雅的方式来实现这一目标吗?我尝试了reduce函数,但是链接必须以链接匹配的方式进行排序.

e-s*_*tis 8

使用发电机有一种非常优雅的方式:

def cycle(lst, val, stop=None):
    d = dict(lst)
    stop = stop if stop is not None else val
    while True:
        yield val
        val = d.get(val, stop)
        if val == stop: break
Run Code Online (Sandbox Code Playgroud)

首先,它允许自然迭代:

>>> for x in cycle([[0, 3], [1, 0], [3, 1]], 0):
....    print x
....
0
3
1
Run Code Online (Sandbox Code Playgroud)

其次,它允许轻松创建列表:

>>> list(cycle([[0, 3], [1, 0], [3, 1]], 0))
[0, 3, 1]
Run Code Online (Sandbox Code Playgroud)

最终,它允许无限项生成:

>>> generator = cycle([[0, 3], [1, 0], [3, 1]], 0, Ellipsis)
>>> generator.next()
... 0
>>> generator.next()
... 3
>>> generator.next()
... 1
>>> generator.next()
... 0
>>> generator.next()
... 3
>>> generator.next()
... 1
>>> generator.next()
... 0
>>> generator.next()
... 3
Run Code Online (Sandbox Code Playgroud)


Max*_* Li 7

考虑使用networkx包:

import networkx as nx
G = nx.DiGraph() #creates directed graph
G.add_edges_from([[0, 3], [1, 0], [3, 1]])
print nx.simple_cycles(G).pop()[:-1]
Run Code Online (Sandbox Code Playgroud)

输出:

>> [0, 3, 1]
Run Code Online (Sandbox Code Playgroud)