结合两个城市之间的航班

时间:2017-03-15 09:46:41

标签: 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 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。为了找到所有可能的旅行,我将问题分成3:

  • 直航
  • 1次中途停留的航班
  • 2次中途停留的航班

(为简单起见,我省略了以下约会日期)

为了获得直飞航班,我可以这样做:

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_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))

最后,我将使用相同的数据结构合并所有3个不同的列表,并按价格或总持续时间对它们进行排序。

问题

如果没有嵌套循环,怎么办呢?

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

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

0 个答案:

没有答案
相关问题