python - 海象运算符不分配变量?
问题描述
玩海象运算符,我有这个合并排序的实现:
def mergesort(array):
if len(array) == 1:
output = array
else:
pivot = len(array) // 2
left = mergesort(array[pivot:])
right = mergesort(array[:pivot])
output = []
while (l := len(left)) or (r := len(right)):
if l and r and left[0] < right[0]:
output.append(left.pop(0))
elif r:
output.append(right.pop(0))
else:
output.append(left.pop(0))
return output
mergesort([66, 93, 85, 46, 56, 88, 56, 75, 55, 99, 87])
但这会返回错误UnboundLocalError: local variable 'r' referenced before assignment
:
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
/tmp/ipykernel_134/1678992391.py in <module>
----> 1 mergesort(array)
/tmp/ipykernel_134/4030760045.py in mergesort(array)
5 else:
6 pivot = len(array) // 2
----> 7 left = mergesort(array[pivot:])
8 right = mergesort(array[:pivot])
9
...
/tmp/ipykernel_134/4030760045.py in mergesort(array)
10 output = []
11 while (l := len(left)) or (r := len(right)):
---> 12 if l and r and left[0] < right[0]:
13 output.append(left.pop(0))
14 elif r:
UnboundLocalError: local variable 'r' referenced before assignment
为什么不r
包含在我的 for 循环中,whilel
是?
解决方案
布尔 OR or
是惰性的,所以当l
结果为真时,(r := len(right))
甚至不会被执行。
在这种情况下,您可以使用非惰性按位 OR |
,尽管这有点滥用。
或者只使用列表的真值而不是它们的长度:
while left or right:
if left and right and left[0] < right[0]:
output.append(left.pop(0))
elif right:
output.append(right.pop(0))
else:
output.append(left.pop(0))
顺便说一句,更好地使用<=
而不是<
,因此它是一种稳定的排序,因为合并排序应该是。
附录:享受懒惰的乐趣:
while left or right:
which = (left or right)[0] <= (right or left)[0] and left or right
output.append(which.pop(0))
另一个,注意我切换到while ... and ...
并在循环之后附加剩余的非空:
while left and right:
which = left if left[0] <= right[0] else right
output.append(which.pop(0))
output += left or right
或者回到你的风格:
while left and right:
if left[0] <= right[0]:
output.append(left.pop(0))
else:
output.append(right.pop(0))
output.extend(left or right)
推荐阅读
- wildfly - 将 Wildfly 作为 Windows 服务启动并等待启动完成
- mongodb - 无法通过 kubernetes 部署文件在 mongodb 中自动创建副本集的步骤
- android - 应用程序生成错误时,运行控制台中出现随机数是什么意思?
- powerbi - Sum where version is high by another variable that can be split by another columns
- python - 用角度渲染 tkinter create_text
- javascript - 如何使用 jquery 的 validate() 在单个页面上验证两个用户的详细信息?
- swift - 在 SwiftUI 中将 swift 应用程序上的所有 Text() 设置为相同的颜色
- c++ - NIC接收数据时C ++ recv没有收到任何内容
- html - 如何解决在转换视频时不显示下载和画中画选项?
- javascript - ExtJS 6.7.0 - SCSS 类未加载