我试图获得所有可能的方式,在特定的一天乘飞机从城市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:
(为简单起见,我省略了以下约会日期)
为了获得直飞航班,我可以这样做:
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,但我不知道如何将其应用到我的案例中。