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
相关产品推荐
相关产品推荐

