Python 2.7字典键值反转优化方案咨询
优化方案:字典键值反转(多键同值转列表)
你的当前实现存在多次遍历原字典的问题(每个唯一值都要遍历一次原字典),当数据量较大时效率会明显下降。以下是几种更高效、简洁的优化方案,均适配Python 2.7:
方案1:单次遍历基础实现
只遍历原字典一次,逐个将键添加到对应值的列表中,时间复杂度为O(n)(n为原字典键的数量):
source_info = { 'benz': 'car', 'audi': 'car', 'bmw': 'car', 'toyata': 'car', 'ferrai': 'car', 'ducati': 'bike', 'suzki': 'bike', 'yamaha': 'bike' } def format_data(source_info=None): result_dict = {} for k, v in source_info.items(): # 若当前值未作为键存在,初始化空列表 if v not in result_dict: result_dict[v] = [] result_dict[v].append(k) return result_dict result = format_data(source_info) print(result)
方案2:使用collections.defaultdict简化代码
利用Python 2.7内置的defaultdict,可以省去判断键是否存在的逻辑,代码更简洁可读,效率和方案1一致:
from collections import defaultdict source_info = { 'benz': 'car', 'audi': 'car', 'bmw': 'car', 'toyata': 'car', 'ferrai': 'car', 'ducati': 'bike', 'suzki': 'bike', 'yamaha': 'bike' } def format_data(source_info=None): result_dict = defaultdict(list) for k, v in source_info.items(): result_dict[v].append(k) # 可选:转为普通字典返回(若不需要defaultdict特性) return dict(result_dict) result = format_data(source_info) print(result)
原代码的其他小优化(非核心)
如果一定要基于你的思路修改,也可以做以下简化:
- 唯一值集合可以直接用
set(source_info.values())替代推导式,更清晰; - 循环内无需生成临时字典,直接用列表推导式收集键:
def format_data(source_info=None): id_unique = set(source_info.values()) result_dict = {} for key in id_unique: # 直接生成键列表,跳过临时字典 result_dict[key] = [k for k, v in source_info.items() if v == key] return result_dict
但这种方式仍然存在多次遍历原字典的问题,不推荐用于大数据量场景。
内容的提问来源于stack exchange,提问作者kumar Raj
相关产品推荐
相关产品推荐

