ValueError:解包需要多于0个值(python列表)

时间:2015-04-12 01:30:46

标签: python sequencing

我在编写代码时遇到错误

tmp = c.pop(0) # taking out the first element from the list as the starting point
complete = tmp[0][-1]
print(complete)

while c != []:
    complete += tmp[1][-1]
    [index] = []
    for i, pair in enumerate(c):
        if pair[0] == tmp[1]:
            [index].append(i)
    temp = c.pop(index)

print(complete)

我在[index] == []部分收到此错误:

Traceback (most recent call last):
ValueError: need more than 0 values to unpack

我的问题是,为什么会出现这个错误,我该如何解决?

1 个答案:

答案 0 :(得分:3)

在Python中,即使变量包含列表,也应该将其用作index = []之类的常规变量。当您使用[index] = []时,Python认为您希望将列表的第一项分配给您的变量。同样,当您使用代码[first, last] = [1,2]时,变量first被赋予1并且变量last被赋值2.这称为解包。

此外,在[index].append(2)中,您不应使用变量名称周围的方括号。这不会引起任何错误,但它会做的是创建一个新列表(唯一的项目是index的值),然后在行执行时销毁列表。

您的代码应该如下所示(假设您的代码的其他部分是正确的)。此外,正如this comment建议的那样,使用c而不是c != [],因为空列表为false,它遵循Python约定。 :

tmp = c.pop(0) # taking out the first element from the list as the starting point
complete = tmp[0][-1]
print(complete)

while c: # c != []
    complete += tmp[1][-1]
    index = [] # [index] = []
    for i, pair in enumerate(c):
        if pair[0] == tmp[1]:
            index.append(i) # [index].append(i)
    temp = c.pop(index)

print(complete)

如评论中所述,行temp = c.pop(index)会出错,因为pop需要一个整数,代码会给它一个列表。

但是,由于OP在代码中使用index,我认为他的意思是将index用作整数。此外,OP表示使用temp代替tmp是错误的。

tmp = c.pop(0) # taking out the first element from the list as the starting point
complete = tmp[0][-1]
print(complete)

while c:
    complete += tmp[1][-1]
    index = 0
    for i, pair in enumerate(c):
        if pair[0] == tmp[1]:
            index = i
    tmp = c.pop(index)

print(complete)