根据交叉点

时间:2018-05-10 22:55:59

标签: python python-3.x algorithm list

根据以下条件,找到在项目对中查找路径的最有效方法(最好是在python-3.5 +中)是什么:

  

对于两个给定对(s1,e1)和(s2,e2),如果e1 == s2e2 == s1,它们应该连接。这里没有重复的路径,每对包含两个不同的名称。而且,每对可以仅连接到另一个路径,并且这里没有孤立的对,即它们都可以连接。

例如,如果输入为:

[('Bergerac','Pau'),
('Nice','Montpelier'),
('Pau','Paris'),
('Marseille','Nice'),
('Montpelier','Bergerac'),
('new','Marseille'),
('old','new'),
('Paris', 'last'),
('dsd', 'sds')]

输出应如下:

('old', 'new', 'Marseille', 'Nice', 'Montpelier', 'Bergerac', 'Pau', 'Paris', 'last')

P.S。这是一个简单的问题,但我找不到任何重复的内容,所以请在评论中留下链接,如果找到的话,我可以关闭/删除问题。

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用容器并在每次符合条件时迭代名称时对其进行更新。

def find_path(names):
    names = names[:]
    total = names.pop()
    while names:
        (c1,*rest, e1)  = total
        for j, (c2,*rest2, e2) in enumerate(names):
            if c1 == e2:
                total = (c2, *rest2, e2, *rest, e1)
                names.pop(j)
            elif e1 == c2:
                total = (c1, *rest, e1, *rest2, e2)
                names.pop(j)
    return total

演示和基准:

In [84]: find_path(lst)
Out[84]: 
('old',
 'new',
 'Marseille',
 'Nice',
 'Montpelier',
 'Bergerac',
 'Pau',
 'Paris',
 'last')

In [85]: %timeit find_path(lst)
12.9 µs ± 99.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)