如何在Python列表推导式中使用赋值,将迭代反转列表代码改写为列表推导式?
列表反转迭代逻辑转列表推导式实现方案
需求背景
已实现时间复杂度为O(n/2)的原地列表反转迭代代码,希望改写为列表推导式实现,学习列表推导式中的赋值操作用法。
原有迭代实现代码
word = list("overflow") length = len(word) for i in range(length//2): word[i] , word[(length-1)-i] = word[(length-1)-i] , word[i] print(word)
错误尝试说明
尝试使用海象运算符:=直接在列表推导式中写交换逻辑,代码如下,因语法不符合Python规范运行失败:
word = list("overflow") length = len(word) word = [ word[i],word[(length-1)-i] := word[(length-1)-i] ,word[i] for i in range(length//2) ] print(word)
错误原因
- 列表推导式的核心设计目标是生成新列表,而非执行原地修改这类副作用操作,直接在推导式元素位置写交换赋值语句不符合Python语法规范
- 海象运算符
:=不支持直接用于元组解包赋值的左值,上述尝试的逗号分隔赋值写法无法在推导式元素表达式中直接生效
实现方案
方案1:符合设计规范的列表推导式写法(推荐)
直接用列表推导式生成反转后的新列表,虽然大O时间复杂度为O(n),但系数不影响大O量级,实际运行效率和原有O(n/2)原地交换无明显差距,语法清晰易读:
word = list("overflow") length = len(word) word = [ word[length - 1 - i] for i in range(length) ] print(word)
方案2:基于推导式副作用实现原地交换(仅作学习使用,不推荐生产环境)
如果一定要在列表推导式中实现原地交换的逻辑,可以借助海象运算符存临时值,利用__setitem__方法执行原地修改,推导式本身生成的无意义列表直接丢弃即可:
word = list("overflow") length = len(word) # 推导式生成的占位列表赋值给_丢弃,实际生效的是执行过程中的原地交换操作 _ = [ (word.__setitem__(length-1 -i, temp), word.__setitem__(i, word[length-1 -i])) for i in range(length//2) if (temp := word[i]) ] print(word)
内容的提问来源于stack exchange,提问作者Hassaan Raheem
相关产品推荐
相关产品推荐

