这是合并排序调整以计算反转。我的代码抛出一个奇怪的错误 (我正在实现algos来学习python 3.x)。
第11行,
in merge_sort first_sorted_half,x = merge_sort(arr [:half])
[上一行重复12次] ValueError:没有足够的值 解包(预期2,得1)
即使我明确地返回两个值?我是python 3的新手,所以我想了解到底发生了什么,我似乎无法在任何地方找到类似的问题。关于更多信息的链接到python docs也将不胜感激!
def merge_sort(arr):
if len(arr) <= 1:
return arr
half = int(len(arr)/2)
first_sorted_half, x = merge_sort(arr[:half])
second_sorted_half, y = merge_sort(arr[half:])
merged_halves, z = merge(first_sorted_half, second_sorted_half)
return merged_halves, x + y + z
def merge(first_half, second_half):
n = len(first_half) + len(second_half)
i = 0
j = 0
split_inversions = 0
ans = []
for k in range(n):
if i >= len(first_half):
ans.append(second_half[j])
j += 1
continue
if j >= len(second_half):
ans.append(first_half[i])
i += 1
continue
if first_half[i] > second_half[j]:
ans.append(second_half[j])
j += 1
split_inversions += len(first_half) - i
elif first_half[i] < second_half[j]:
ans.append(first_half[i])
i += 1
return ans, split_inversions
numbers = [3,2,1,4,5,6,8,10,9]
print(merge_sort(numbers))
答案 0 :(得分:0)
您收到的错误表示您的程序执行了12次递归调用,最后它无法解压缩结果。
这意味着,python希望您从merge_sort
返回两个值,因为您将结果解压缩到first_sorted_half
和x
。但是,当您从条件arr
仅返回len(arr) <=1
时,没有值可以解包,只有存在数组。
所以你如何解决这个问题,就是为基本情况返回一个值,比如return arr, len(arr)
。
答案 1 :(得分:0)
虽然ilke444是对的 - 需要更多的澄清。首先:返回数据变量是你需要的,但我不太了解len(arr)&lt; = 1,我对stackflow很新,我不知道Python 3的这个特性。我专注于Pygame /标准包装。
第一件事 - 在这个&#34; Code Snippet&#34; (如果是)未定义;和/或需要定义。如你所知,Len代表长度 - 并使用引号(&#39;&#39;)来使用它。 像这样:
len('arr')
会打印:
3
因为此集合中有3个字符。你显然是python 3的新手,因为语法略有不同。
因为这可能只解决了第一位 - 有了这些信息,我会给你留下更多的东西。 致电打印需要报价(&#39;&#39;), 列表有[]括号而不是(), 字典有{}括号和变量现在需要通过变量定义或函数来定义,除非放入引号。
谢谢, 杰里