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

Swift字典键值反转:如何以函数式方式实现(禁用for循环)

函数式风格实现字典键值互换(收集重复值)

嘿,这个问题挺有意思的——用函数式风格实现键值互换还得收集重复值,完全避开显式for循环对吧?我刚好有两个靠谱的方案,给你捋一捋:

方案1:使用functools.reduce(最贴合函数式核心)

reduce是函数式编程里的经典高阶函数,它能把一个累积函数应用到可迭代对象的每个元素上,逐步构建最终结果。这里我们用它来逐步构建互换后的字典:

from functools import reduce

original_dict = {"a": 1, "b": 2, "c": 1, "d": 2}

def accumulate_swap(acc, item):
    # 拆分原字典的键值对
    original_key, original_value = item
    # setdefault确保值不存在时创建空列表,存在则直接追加原键
    acc.setdefault(original_value, []).append(original_key)
    return acc

# 初始值是空字典,遍历原字典的所有键值对进行累积
swapped_dict = reduce(accumulate_swap, original_dict.items(), {})
print(swapped_dict)
# 输出: {1: ['a', 'c'], 2: ['b', 'd']}

为什么这是函数式风格?

  • 没有显式的for循环,依赖高阶函数reduce处理迭代逻辑
  • 累积函数accumulate_swap是纯函数(输入确定则输出确定,无额外副作用)
  • 整个过程是数据驱动的,通过函数组合完成转换

方案2:使用itertools.groupby(适合有序场景)

如果能接受先排序的步骤,groupby也是个不错的函数式选择。不过要注意:groupby只会对连续的相同元素分组,所以得先把反转后的键值对按值排序:

from itertools import groupby
from operator import itemgetter

original_dict = {"a": 1, "b": 2, "c": 1, "d": 2}

# 先把原键值对反转成 (值, 原键) 的形式,再按值排序
sorted_reversed_items = sorted(
    ((v, k) for k, v in original_dict.items()),
    key=itemgetter(0)
)

# 按值分组,然后把每组的原键收集成列表
swapped_dict = {
    group_key: [original_key for _, original_key in group_items]
    for group_key, group_items in groupby(sorted_reversed_items, key=itemgetter(0))
}
print(swapped_dict)
# 输出: {1: ['a', 'c'], 2: ['b', 'd']}

注意点

这里的字典推导式虽然看起来有循环,但它属于Python的函数式语法糖,没有显式写出for循环的控制逻辑,也符合你要求的“不使用for循环”的核心诉求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:03:55