【问题标题】:"ValueError: too many values to unpack" python exception when iterating a list of list迭代列表时出现“ValueError:无法解包的值太多”python 异常
【发布时间】:2017-04-30 04:03:42
【问题描述】:

我正在尝试构建一个操作函数(练习)的程序 - 显示有关要激活的当前函数的消息,获取激活函数所需的必要参数的输入,具体取决于参数的类型和数量,并激活它。

尝试运行它时,出现以下异常: ValueError:要解压的值太多(预计 3 个)

代码:

s = ['Q4', 'Q5a', 'Q5b', 'Q5c', 'Q5d', 'Q6']
f = [Trapez_rule, myFilter, myFilterMulti, myPrime, isFib, repeated]
inp = [['function', 'boundry a', 'boundry b', 'parts'], ['list', 'function'], ['list', 'list of functions'], ['number'], ['number'], ['function', 'number']]
reqtype = [['f', 'n', 'n', 'n'], ['l', 'f'], ['l', 'lf'], ['n'], ['n'], ['f', 'n']]

for j, k, l in f, inp, reqtype: # for i, j, k, l in s, f, inp, reqtype:
    # print(i)
    print(j.__doc__)
    lst = []
    for w, r in k, l:
        print(w)
        if r == 'f':
            x = input()
            x = 'lambda x: '
            exec(x)
            lst.append(x) # 'x'
        elif r == 'n':
            x = input()
            lst.append(x)
        elif r == 'l':
            m = []
            x = 0
            while x != -1:
                x = input()
                m.append(x)
            lst.append(m)
        elif r == 'lf':
            m = []
            x = 0
            while x != -1:
                x = input()
                x = 'lambda x: '
                exec(x)
                m.append(x)
            lst.append(m)
    execfunc = 'j('
    for q in range(len(lst) - 1):
        execfunc += lst[q] + ', '
    execfunc += lst[q] + ')'
    exec(execfunc)

我不明白如何修复代码,但我认为原因是使用嵌套列表作为循环的索引。

【问题讨论】:

  • 我不知道你认为x = input(); x = 'lambda x: '; exec(x) 会做什么。
  • 你能发布堆栈跟踪吗?这段代码有用过吗?
  • 你认为for j, k, l in f, inp, reqtype: 是做什么的?我不认为它会那样做。
  • @DanielRoseman 我很确定他正在尝试将用户输入转换为匿名函数并执行它,但这不是它的作用。

标签: python debugging exception


【解决方案1】:

我相信你对这条线的作用感到困惑:

for j, k, l in f, inp, reqtype:

我相信您预计,在第一次迭代中,j 将采用 f 中的第一个值,k 将采用 inp 中的第一个值,l 将采用reqtype 中的第一个值。在第二次迭代中,jkl 将分别采用 finpreqtype 的第二个值。

这不是它的作用。

试试这个:

for j, k, l in zip(f, inp, reqtype):

Zip 在Python Standard Library 文档here 中进行了描述。

【讨论】:

  • 它有帮助。但是现在还有另一个问题——“execfunc”的代码没有返回任何东西。你知道为什么吗?我尝试打印它之前将执行的命令,这很好。 j 指向函数。此外,列表的输入 while 循环在将“-1”作为输入时不会中断。
  • 我能够解决大部分问题,除了函数由于某种原因返回“无”。调用 j 及其参数。 j 是函数列表的迭代器。你能帮我弄清楚是什么原因造成的吗?另外,我很好奇——“zip”命令真的有用吗?
  • @גלזיגלר - 我不会推测为什么 j() 返回 None。这可能值得在一个新问题中提出。我在答案中添加了指向zip() 文档的链接。我可以建议您通过The Python Tutorial 工作,并熟悉standard library documentation 吗?
猜你喜欢
  • 2021-06-24
  • 2022-01-15
  • 2014-09-15
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
相关资源
最近更新 更多