如何将Python的detail_flights列表转换为指定键名的字典结构
Python列表转指定结构字典问题处理
问题描述
我需要将Python中的detail_flights列表转换为符合要求的字典,该列表的部分数据如下(整体结构完全一致):
detail_flights = ['22:20 – 23:55\nBGY Bergamo Orio al Serio\n‐\nBCN Barcellona-El Prat\ndiretto\n1h 35m\n6:20 – 8:00\nBCN Barcellona-El Prat\n‐\nBGY Bergamo Orio al Serio\ndiretto\n1h 40m', '22:20 – 23:55\nBGY Bergamo Orio al Serio\n‐\nBCN Barcellona-El Prat\ndiretto\n1h 35m\n12:05 – 13:45\nBCN Barcellona-El Prat\n‐\nBGY Bergamo Orio al Serio\ndiretto\n1h 40m']
我需要使用如下指定的键名列表来映射数据:
detail_headers = ['departure_time', 'departure_airport', 'to_delete', 'arrival_airport', 'type_flight', 'duration']
期望得到的输出结构示例如下:
detail_flights = [{'departure_time': '22:20 – 23:55', 'departure_airport': 'BGY Bergamo Orio al Serio', 'to_delete': '-', 'arrival_airport': 'BCN Barcellona-El Pra', 'type_flight': 'diretto', 'duration': '1h 35', 'departure_time': '6:20 – 8:00', 'departure_airport': 'BCN Barcellona-El Prat', 'arrival_airport': 'BGY Bergamo Orio al Serio', 'type_flight': 'diretto', 'duration': '1h 40m'}, {....}]
我目前编写的代码如下:
def listToString(s): str1 = " " return (str1.join(detail_flights)) detail_flights = listToString(detail_flights) detail_flights = detail_flights.split(sep='\n') from itertools import zip_longest detail_headers = ['departure_time', 'departure_airport', 'to_delete', 'arrival_airport', 'type_flight', 'duration'] d1=zip_longest(detail_headers,detail_flights) print (dict(d1))
当前运行后得到的错误输出如下,无法满足需求:
{'departure_time': '22:20 – 23:55', 'departure_airport': 'BGY Bergamo Orio al Serio', 'to_delete': '‐', 'arrival_airport': 'BCN Barcellona-El Prat', 'type_flight': 'diretto', 'duration': '1h 35m', None: '1h 45m'}
请问我该如何修正代码,实现将列表转换为符合要求的字典结构?
解决方案
问题说明
你给出的期望输出存在Python字典不支持的重复键,同一个字典内如果出现多次相同键名,后写入的值会直接覆盖前面的值,无法同时保留去程和返程的同名字段数据。结合原始数据中每个字符串对应一组往返航班的特性,以下是合法可运行的实现方案:
修正后代码
# 原始数据 detail_flights = ['22:20 – 23:55\nBGY Bergamo Orio al Serio\n‐\nBCN Barcellona-El Prat\ndiretto\n1h 35m\n6:20 – 8:00\nBCN Barcellona-El Prat\n‐\nBGY Bergamo Orio al Serio\ndiretto\n1h 40m', '22:20 – 23:55\nBGY Bergamo Orio al Serio\n‐\nBCN Barcellona-El Prat\ndiretto\n1h 35m\n12:05 – 13:45\nBCN Barcellona-El Prat\n‐\nBGY Bergamo Orio al Serio\ndiretto\n1h 40m'] detail_headers = ['departure_time', 'departure_airport', 'to_delete', 'arrival_airport', 'type_flight', 'duration'] result = [] for item in detail_flights: # 拆分单个行程字符串为字段列表 fields = item.split('\n') # 按6个字段一组拆分,分别对应去程、返程 go_dict = dict(zip(detail_headers, fields[:6])) return_dict = dict(zip(detail_headers, fields[6:])) # 不需要to_delete字段可打开下面两行删除 # del go_dict['to_delete'] # del return_dict['to_delete'] # 方案1:每个行程存储为[去程字典, 返程字典]的列表结构,可直接对应你原始的两段航班数据 result.append([go_dict, return_dict]) # 方案2:每个行程存储为带go/return标识的字典,按需二选一 # result.append({"go": go_dict, "return": return_dict}) print(result)
输出示例(方案1)
[ [ {'departure_time': '22:20 – 23:55', 'departure_airport': 'BGY Bergamo Orio al Serio', 'to_delete': '‐', 'arrival_airport': 'BCN Barcellona-El Prat', 'type_flight': 'diretto', 'duration': '1h 35m'}, {'departure_time': '6:20 – 8:00', 'departure_airport': 'BCN Barcellona-El Prat', 'to_delete': '‐', 'arrival_airport': 'BGY Bergamo Orio al Serio', 'type_flight': 'diretto', 'duration': '1h 40m'} ], [ {'departure_time': '22:20 – 23:55', 'departure_airport': 'BGY Bergamo Orio al Serio', 'to_delete': '‐', 'arrival_airport': 'BCN Barcellona-El Prat', 'type_flight': 'diretto', 'duration': '1h 35m'}, {'departure_time': '12:05 – 13:45', 'departure_airport': 'BCN Barcellona-El Prat', 'to_delete': '‐', 'arrival_airport': 'BGY Bergamo Orio al Serio', 'type_flight': 'diretto', 'duration': '1h 40m'} ] ]
内容的提问来源于stack exchange,提问作者Box
相关产品推荐
相关产品推荐

