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

如何用单个for循环或itertools库实现字典反向查找?

反向查找字典的非双重嵌套循环实现方案

嘿,完全懂你对双重嵌套for循环的抵触——多层嵌套的代码确实容易让人看晕,下面给你几个更清爽、可读性更好的实现方式,覆盖单循环、itertools工具以及函数式编程风格:

1. 单循环+setdefault(最直观易读)

这个方案虽然内部会遍历列表元素,但写法上没有嵌套的“双层for”缩进,逻辑清晰,是日常最常用的方式:

original_dict = {"a": [1, 2], "b": [2, 3], "c": [3, 4]}
reverse_dict = {}

for key, values in original_dict.items():
    # 遍历当前键对应的所有值,逐个添加到反向字典中
    for val in values:
        reverse_dict.setdefault(val, []).append(key)

print(reverse_dict)
# 输出: {1: ['a'], 2: ['a', 'b'], 3: ['b', 'c'], 4: ['c']}

setdefault会自动处理键不存在的情况,省去了手动判断的代码,让逻辑更紧凑。

2. itertools.chain+字典推导式(一行式函数风格)

如果你喜欢更简洁的写法,可以用itertools.chain扁平化所有值,再结合字典推导式实现:

import itertools

original_dict = {"a": [1, 2], "b": [2, 3], "c": [3, 4]}
# 先扁平化所有值,再为每个值收集对应的键
reverse_dict = {
    val: [k for k, vs in original_dict.items() if val in vs]
    for val in itertools.chain.from_iterable(original_dict.values())
}

⚠️ 注意:这个方案的效率较低,因为每个值都要遍历原字典的所有键值对去匹配,适合数据量小的场景。

3. itertools.chain+defaultdict(高效的单循环写法)

如果想要兼顾效率和代码整洁,可以用itertools.chain把原字典的键值对转换成(值, 键)的迭代器,外层只需要一个for循环:

from collections import defaultdict
import itertools

original_dict = {"a": [1, 2], "b": [2, 3], "c": [3, 4]}
reverse_dict = defaultdict(list)

# 生成所有(值, 键)的元组,用chain扁平化后遍历
for val, key in itertools.chain.from_iterable(
    ((v, key) for v in values) for key, values in original_dict.items()
):
    reverse_dict[val].append(key)

# 若需要普通字典,可转为dict(reverse_dict)
print(dict(reverse_dict))

这个方案把嵌套的生成器逻辑封装到了chain内部,外层只有一层循环,代码看起来更清爽,同时效率和第一种方案相当。

4. functools.reduce(函数式编程风格)

如果你偏爱函数式编程,可以用reduce来累积构建反向字典,把循环逻辑封装到单独的函数中:

from functools import reduce
from collections import defaultdict

original_dict = {"a": [1, 2], "b": [2, 3], "c": [3, 4]}

def update_reverse_dict(acc, item):
    key, values = item
    for val in values:
        acc[val].append(key)
    return acc

# 用reduce逐步累积结果,初始值是一个defaultdict
reverse_dict = dict(reduce(update_reverse_dict, original_dict.items(), defaultdict(list)))

这种方式把构建逻辑和数据分离,适合需要复用构建逻辑的场景,代码的可读性也不错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:25:58