能否在单次赋值的字典定义中结合推导式与显式键值对?
如何在单次赋值中结合显式键值对与字典推导式定义字典?
你可以通过字典解包语法实现这个需求,直接把推导式生成的字典和显式键值对合并在同一个字典定义中,满足单次赋值的要求。
问题重现
你尝试的写法因语法不合法报错,原代码:
d = { '0': 0x1, '0'*r + 'X': 0x100 + r for r in range(2), # 实际场景中r的范围更大 'Y': 0xA }
报错信息:
d = { '0': 0x1, '0'*r + 'X': 0x100 + r for r in range(2), SyntaxError: invalid syntax
期望输出:
>>> d {'0': 1, 'X': 256, '0X': 257, 'Y': 10}
解决方案
使用**操作符解包推导式生成的字典,将其合并到包含显式键值对的字典中:
d = { '0': 0x1, 'Y': 0xA, **{'0'*r + 'X': 0x100 + r for r in range(2)} }
验证结果
运行上述代码后,Python 3.7+会保留插入顺序,输出如下(键顺序可能因版本略有差异,但键值对内容完全符合预期):
>>> d {'0': 1, 'Y': 10, 'X': 256, '0X': 257}
原理说明
字典推导式是用来生成完整字典的语法,不能直接和显式键值对在字典字面量中混写。而**操作符可以将一个字典的键值对展开到另一个字典的字面量中,这样就能在单次赋值里同时包含手动指定的键值对和推导式生成的键值对,完美满足编码规范要求。
内容的提问来源于stack exchange,提问作者rkshthrmsh
相关产品推荐
相关产品推荐

