如何在Python中将含逗号分隔元素的列表转换为嵌套列表?
转换嵌套列表并高效排序的实现方案
原输入列表
original_list = ['BUD', 'CDG', 'DEL', 'DOH', 'DSM,ORD', 'EWR,HND', 'EWR,HND,ICN', 'EWR,HND,JFK', 'EWR,HND,JFK,LGA', 'EWR,HND,JFK,LGA', 'EWY,LHR', 'EWY,LHR,SFO,DSM', 'EWY,LHR,SFO,DSM,ORD,BGI', 'EWY,LHR,SFO,DSM,ORD,BGI,LGA', 'EWY,LHR,SFO,SAN', 'HND,ICN', 'ICN', 'ICN,JFK', 'ICN,JFK,LGA', 'ICN,JFK,LGA', 'LGA', 'LGA', 'LHR,SFO', 'LHR,SFO,DSM,ORD', 'LHR,SFO,SAN', 'LHR,SFO,SAN,EWY', 'ORD,BGI', 'SAN', 'SAN,EWY,LHR', 'SAN,EWY,LHR,SFO,DSM', 'SAN,EWY,LHR,SFO,DSM,ORD,BGI', 'SAN,EWY,LHR,SFO,DSM,ORD,BGI,LGA', 'SAN,EWY,LHR,SFO,DSM,ORD,BGI,LGA', 'SFO,DSM', 'SFO,DSM,ORD,BGI', 'SFO,SAN', 'SFO,SAN,EWY,LHR', 'SIN,CDG,BUD', 'TLV,DEL,DOH']
1. 转换为嵌套列表
遍历原列表,将每个逗号分隔的字符串拆分为子列表:
nested_list = [item.split(',') for item in original_list]
2. 去重(可选,解决原列表重复项问题)
由于列表不可直接哈希,先转为元组存入集合去重,再转回列表:
unique_nested = [list(tpl) for tpl in set(tuple(sublist) for sublist in nested_list)]
3. 高效排序
Python内置的sort采用Timsort算法,时间复杂度为O(k log k)(k为去重后的列表长度),可根据需求选择排序规则:
- 按子列表长度排序(短列表在前):
unique_nested.sort(key=lambda x: len(x)) - 按子列表首元素字典序排序:
unique_nested.sort(key=lambda x: x[0]) - 先按长度排序,再按首元素字典序排序:
unique_nested.sort(key=lambda x: (len(x), x[0]))
完整代码示例
original_list = ['BUD', 'CDG', 'DEL', 'DOH', 'DSM,ORD', 'EWR,HND', 'EWR,HND,ICN', 'EWR,HND,JFK', 'EWR,HND,JFK,LGA', 'EWR,HND,JFK,LGA', 'EWY,LHR', 'EWY,LHR,SFO,DSM', 'EWY,LHR,SFO,DSM,ORD,BGI', 'EWY,LHR,SFO,DSM,ORD,BGI,LGA', 'EWY,LHR,SFO,SAN', 'HND,ICN', 'ICN', 'ICN,JFK', 'ICN,JFK,LGA', 'ICN,JFK,LGA', 'LGA', 'LGA', 'LHR,SFO', 'LHR,SFO,DSM,ORD', 'LHR,SFO,SAN', 'LHR,SFO,SAN,EWY', 'ORD,BGI', 'SAN', 'SAN,EWY,LHR', 'SAN,EWY,LHR,SFO,DSM', 'SAN,EWY,LHR,SFO,DSM,ORD,BGI', 'SAN,EWY,LHR,SFO,DSM,ORD,BGI,LGA', 'SAN,EWY,LHR,SFO,DSM,ORD,BGI,LGA', 'SFO,DSM', 'SFO,DSM,ORD,BGI', 'SFO,SAN', 'SFO,SAN,EWY,LHR', 'SIN,CDG,BUD', 'TLV,DEL,DOH'] # 转换为嵌套列表 nested_list = [item.split(',') for item in original_list] # 去重 unique_nested = [list(tpl) for tpl in set(tuple(sublist) for sublist in nested_list)] # 按长度+首元素排序 unique_nested.sort(key=lambda x: (len(x), x[0])) print(unique_nested)
关键操作说明
split(','):核心转换操作,时间复杂度O(n*m)(n为原列表长度,m为字符串平均分割数),属于线性高效操作。- 集合去重:利用集合O(1)的查找特性,整体去重过程时间复杂度O(n)。
- Timsort排序:Python内置的高效排序算法,在大多数场景下表现优于其他排序实现。
内容的提问来源于stack exchange,提问作者Mudit Atrey
相关产品推荐
相关产品推荐

