gpt4 book ai didi

python - 海象运算符不分配变量?

转载 作者:行者123 更新时间:2023-12-02 18:27:16 31 4
gpt4 key购买 nike

使用海象运算符,我实现了合并排序:

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:赋值前引用的局部变量“r”:

---------------------------------------------------------------------------
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

为什么我的 for 循环中没有包含 r,而 l 包含在其中?

最佳答案

Boolean OR or很懒,所以当 l事实证明是真的,(r := len(right))甚至没有被执行。

您可以使用非惰性 bitwise OR |在这种情况下,尽管有点滥用。

或者只使用 truth value列表的数量而不是它们的长度:

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)

关于python - 海象运算符不分配变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69977641/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com