如何将列表转换为值为对应索引列表的字典?求更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
相关产品推荐
相关产品推荐

