如何用一行Lambda表达式实现指定的Python字典生成逻辑?
一行代码实现成对键值映射的字典生成
需求是生成键值成对映射的字典:{0: 1, 1: 0, 2: 3, 3: 2, 4: 5, 5: 4, 6: 7, 7: 6, 8: 9, 9: 8},原循环实现的函数如下:
def make_dict(): y = {} for i in range(0, 10, 2): y[i] = i+1 y[i+1] = i return y
你尝试的字典推导式无法得到预期结果,问题出在range(0, 10, 2)只遍历了偶数,推导式里的else分支根本不会触发,最终只生成了偶数到奇数的映射,缺少反向的奇数到偶数的条目。
解决方案
方式1:直接遍历所有数字的字典推导式
这是最简洁的实现:
{i: i+1 if i % 2 == 0 else i-1 for i in range(10)}
遍历0到9的每个数字,偶数键对应i+1,奇数键对应i-1,正好生成预期的成对映射。
方式2:用Lambda包装成函数
如果需要和原函数一样通过调用函数获取结果,可以用Lambda包装上述推导式:
make_dict = lambda: {i: i+1 if i % 2 == 0 else i-1 for i in range(10)}
调用make_dict()即可得到目标字典。
方式3:基于原循环逻辑展开的推导式
如果想贴合原循环中处理成对数字的思路,可以用嵌套生成器展开键值对:
{k: v for pair in [(i, i+1) for i in range(0,10,2)] for k, v in [(pair[0], pair[1]), (pair[1], pair[0])]}
先生成所有(偶数, 奇数)的元组,再把每个元组的正反映射都加入字典。
内容的提问来源于stack exchange,提问作者ardu ros
相关产品推荐
相关产品推荐

