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

如何将列表转换为值为对应索引列表的字典?求更Pythonic高效的实现

实现优化方案

你目前的写法逻辑完全正确,时间复杂度为O(n),属于最优的时间复杂度范畴,下面给出两个更符合Python习惯的优化写法:

1. 结合enumerate + collections.defaultdict(最推荐,可读性和简洁度平衡最好)

from collections import defaultdict

def list_to_dict(l):
    d = defaultdict(list)
    for idx, val in enumerate(l):
        d[val].append(idx)
    return dict(d) # 如果不需要保留defaultdict类型,可以转成普通字典

这种写法省去了手动判断键是否存在、初始化空列表的逻辑,同时用enumerate替代range(len(l))直接同时获取索引和元素,写法更简洁直观,是最通用的Pythonic实现。

2. 不想引入额外导入的场景,可以用字典的setdefault方法简化原逻辑

def list_to_dict(l):
    d = {}
    for idx, val in enumerate(l):
        d.setdefault(val, []).append(idx)
    return d

setdefault的作用是如果键不存在就设置默认值,存在就直接返回对应的值,刚好可以省去显式的if判断,比原写法更精简。


效率对比说明

三种写法的时间复杂度完全一致,都是遍历一次列表即可完成构建,差异仅为常数级:

  • 数据量极小的场景下纯手动判断的原写法会略快,因为没有额外的函数调用开销
  • 数据量超过1000的场景下defaultdict的性能会略高于另外两种,因为C实现的默认值处理比Python层的setdefault和if判断效率更高
  • 实际业务场景下三种写法的性能差异可以忽略,优先选择可读性最好的即可。

内容的提问来源于stack exchange,提问作者weilueluo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:54:05