【问题标题】:Why do I get a 'valueError' despite explicitly returning the expected number of values?尽管显式返回了预期的值数量,为什么我会得到一个“valueError”?
【发布时间】:2017-01-17 22:00:27
【问题描述】:

这是经过调整以计算反转的合并排序。我的代码抛出一个奇怪的错误 (我正在实施算法来学习 python 3.x)。

在第 11 行,

在 merge_sort first_sorted_half 中,x = merge_sort(arr[:half])
[上一行重复了 12 次以上] ValueError: not enough values 解包(预期 2,得到 1)

即使我明确地返回两个值?我是 python 3 的新手,所以我想确切地了解这里发生了什么,我似乎在任何地方都找不到类似的问题。也将不胜感激提供指向 python 文档的链接以获取更多信息!

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

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

    这意味着,python 期望您从 merge_sort 返回两个值,因为您将结果解压缩为 first_sorted_halfx。但是,当您从条件len(arr) &lt;=1 中仅返回arr 时,没有值可解包,只有数组存在。

    那么你如何解决这个问题是返回一个基本情况的值,比如return arr, len(arr)

    【讨论】:

      【解决方案2】:

      虽然 ilke444 是正确的 - 需要进一步澄清。首先:返回数据变量是你需要的,但我对 len(arr)

      第一件事 - 此“代码片段”(如果是)中的 arr 未定义;和/或将需要定义。如您所知,Len 代表长度 - 并使用引号 (' ') 来使用它。 像这样:

      len('arr')
      

      将打印:

      3
      

      因为这个集合中有 3 个字符。正如您所说,您显然是 python 3 的新手,因为语法略有不同。

      因为这可能只解决了第一点 - 有了这些信息,我会给你留下更多的东西。 调用打印需要引号(''), 列表有 [ ] 括号而不是 (), 字典有 {} 括号,并且变量现在需要通过变量定义或函数定义,除非放在引号中。

      谢谢, 杰瑞

      【讨论】:

      • 而且,顺便说一句,您可能会以一种非常奇怪的方式遇到语法错误。
      • 不是真的,arr 只是我列表的变量名。我必须做的唯一改变是为我的基本情况返回 arr, 0 (len(arr)
      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 2019-03-17
      • 2021-11-05
      • 2021-12-04
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多