Python表达式中是否支持为子表达式设置临时别名?
Python表达式临时别名实现说明
Python原生支持在表达式内部为子表达式设置临时别名,以下是对应你需求的实现方案:
语法支持说明
你示例中写的with ... as别名语法目前不是Python的合法推导式语法,但有两种等价的合法实现方式:
方案1:Python 3.8+ 海象运算符(:=)实现
使用3.8版本引入的赋值表达式,可以直接在推导式内定义临时别名,写法和你预期的效果最接近:
dict_b = [r[1] - r[0] for key in dict_a if (r := dict_a[key])]
如果你的字典值不会存在None、0、空序列这类假值,上述写法不会过滤任何元素,完全符合你的需求。
方案2:全Python版本兼容实现
如果需要兼容3.8之前的版本,可以通过嵌套生成器提前做值映射,相当于设置临时别名:
# 通用写法,对应你示例的逻辑 dict_b = [r[1] - r[0] for r in (dict_a[key] for key in dict_a.keys())] # 你的场景可以进一步简化,直接迭代字典的值,无需读取key dict_b = [r[1] - r[0] for r in dict_a.values()] # 额外优化:因为所有值都是长度为2的列表,可以直接解包,可读性更高 dict_b = [end - start for start, end in dict_a.values()]
内容的提问来源于stack exchange,提问作者DerekG
相关产品推荐
相关产品推荐

