You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

原代码的其他小优化(非核心)

如果一定要基于你的思路修改,也可以做以下简化:

  1. 唯一值集合可以直接用set(source_info.values())替代推导式,更清晰;
  2. 循环内无需生成临时字典,直接用列表推导式收集键:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:32:42