尽管显式返回了预期的值,但为什么会出现'valueError'?

时间:2017-01-17 01:33:16

标签: python python-3.x

这是合并排序调整以计算反转。我的代码抛出一个奇怪的错误 (我正在实现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))

2 个答案:

答案 0 :(得分:0)

您收到的错误表示您的程序执行了12次递归调用,最后它无法解压缩结果。

这意味着,python希望您从merge_sort返回两个值,因为您将结果解压缩到first_sorted_halfx。但是,当您从条件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;), 列表有[]括号而不是(), 字典有{}括号和变量现在需要通过变量定义或函数来定义,除非放入引号。

谢谢, 杰里