Python 合并两个城市之间的航班

Python 合并两个城市之间的航班,python,for-loop,routing,nested-loops,Python,For Loop,Routing,Nested Loops,我试图获得所有可能的方式从a城市到B城市在给定的一天乘坐飞机,最多2站 我输入了一个字典列表: flights = [ ... {'dep': 'FRA', 'arr': 'AMS', 'dep_dt': '2017-05-01 12:00:00', 'arr_dt': '2017-05-01 13:15:00', 'price': 100}, {'dep': 'FRA', 'arr': 'CPH', 'dep_dt': '2017-05-01 1

我试图获得所有可能的方式从a城市到B城市在给定的一天乘坐飞机,最多2站

我输入了一个字典列表:

flights = [
        ...
        {'dep': 'FRA', 'arr': 'AMS', 'dep_dt': '2017-05-01 12:00:00', 'arr_dt': '2017-05-01 13:15:00', 'price': 100},
        {'dep': 'FRA', 'arr': 'CPH', 'dep_dt': '2017-05-01 10:00:00', 'arr_dt': '2017-05-01 12:00:00', 'price': 80},
        {'dep': 'FRA', 'arr': 'MAD', 'dep_dt': '2017-05-01 09:00:00', 'arr_dt': '2017-05-01 10:50:00', 'price': 30},
        {'dep': 'CPH', 'arr': 'AMS', 'dep_dt': '2017-05-01 15:00:00', 'arr_dt': '2017-05-01 16:30:00', 'price': 60},
        {'dep': 'CPH', 'arr': 'MAD', 'dep_dt': '2017-05-01 14:15:00', 'arr_dt': '2017-05-01 17:10:00', 'price': 70},
        {'dep': 'MAD', 'arr': 'AMS', 'dep_dt': '2017-05-01 19:00:00', 'arr_dt': '2017-05-01 21:40:00', 'price': 20},
       ...
    ]
在许多城市之间的许多日期有数千条记录

例子 假设我希望所有的可能性都从FRA转移到AMS。为了找到所有可能的行程,我将问题分为三部分:

  • 直航
  • 中途停留1次的航班
  • 有两次中途停留的航班
(为了简单起见,我建议日期限制如下)

为了获得直达航班,我可以做:

direct_flights = [f for f in flights if f['dep']=='FRA' and f['arr']=='AMS']
为了获得一次中途停留的行程,我选择了嵌套循环。不是最优的,但它是有效的:

first_segment = [f for f in flights if f['dep']=='FRA']
second_segment = [f for f in flights if f['arr']=='AMS']

flights_w_1stop = []
for s1 in first_segment:
    for s2 in second_segment:
        if (s1['arr'] == s2['dep'] and
            s1['arr_dt'] < s2['dep_dt']):
            flights_w_1stop.append((s1, s2))
first_段=[f代表飞行中的f,如果f['dep']='FRA']
第二个_段=[f代表飞行中的f,如果f['arr']=='AMS']
航班w_1stop=[]
对于第一个_段中的s1:
对于第二个_段中的s2:
如果(s1['arr']==s2['dep']和
s1['arr_dt']
现在,为了让所有的旅程都有两次中途停留,我只能想出一种与上面类似的方法,但这会产生两个嵌套的循环,这看起来很可怕,当我有很多航班时,速度会非常慢

first_segment = [f for f in flights if f['dep']=='FRA']
second_segment = [f for f in flights]
third_segment = [f for f in flights if f['arr']=='AMS']

flights_w_2stops = []
for s1 in first_segment:
    for s2 in second_segment:
        for s3 in third_segment:
            if (s1['arr'] == s2['dep'] and
                s2['arr'] == s3['dep'] and
                s1['arr_dt'] < s2['dep_dt'] and
                s2['arr_dt'] < s3['dep_dt']):
                flights_w_2stops.append((s1, s2, s3))
first_段=[f代表飞行中的f,如果f['dep']='FRA']
第二个_段=[f代表飞行中的f]
第三个_段=[f代表飞行中的f,如果f['arr']=='AMS']
航班w_2stops=[]
对于第一个_段中的s1:
对于第二个_段中的s2:
对于第三段中的s3:
如果(s1['arr']==s2['dep']和
s2['arr']==s3['dep']和
s1['arr_dt']
最后,我将用相同的数据结构合并所有3个不同的列表,并按价格或总持续时间对它们进行排序

问题: 如果没有嵌套循环,这怎么办

注:我读过有关图表,但我不认为我会考虑两个以上的中途停留。此外,这将意味着学习一种新的方法。学习总是好的,所以如果这是最好的选择,我会投入时间。但是如果类似的事情可以用另一种方式来完成(以某种方式重新排列嵌套循环?),我更愿意这样做


我也发现了这一点,但我不知道如何将其应用到我的案例中。

您的代码目前有效吗?如果是这样的话,它可能更适合放在CodeReview而不是这里。我投票将这个问题作为离题题来结束,因为它属于您的建议,我在CodeReview上发布了这个问题: