列表的列表和“Too many values to unpack”

17

我正在尝试使用以下代码处理一个列表的列表,创建一个新的列表的列表,其中新元素是旧列表中的元素的某种组合……如果这有任何意义的话!这是代码:

 for index, item in outputList1:
    outputList2 = outputList2.append(item[6:].extend(outputList1[index+1][6:]))

然而,我遇到了一个“ Too many values to unpack”错误。即使使用以下代码也会出现此错误:

    for index, item in outputList1:
       pass

我可能做错了什么?


3
'enumerate' 这个函数没有出现,即在遍历 otputList1 列表时缺少了它。可以使用如下方式来遍历:for index, item in enumerate(otputList1) : - doug
还有,我第一行的语法是不正确的,我只需要:outputList2.append(item[6:].extend(outputList1[index+1][6:]))已经和C打交道太久了! - MattyZ
在Python3中,您可以使用for index, *item in outputList1语法。这样,index将包含第一个元素,而item将包含其余的元素。 - Martin Thoma
可能是重复的问题:在迭代字典时出现“too many values to unpack”的错误,键=>字符串,值=>列表。请参考此链接:https://dev59.com/AG035IYBdhLWcg3wW-z1 - Pablo Jomer
@Bitrex,我知道我来得太晚了,但对于将来访问此页面的用户来说,你指定outputList1包含什么会非常有帮助。 你说它是“列表的列表”,但每个内部列表中有多少元素?如果你能在顶部写一行outputList1 = [ . . .]就好了。 - abcd
2个回答

27

for语句在可迭代对象上进行迭代--对于一个列表而言,它会逐个迭代其内容,因此在每次迭代中,都会有一个值可用。

当使用 for index, item in list: 时,你正在尝试将一个值拆分成两个变量。这可以使用 for key, value in dict.items(): 来完成,该语句以任意顺序迭代字典的键/值。由于你似乎想要一个数字索引,因此存在一个函数enumerate(),它获取可迭代对象的值以及其索引:

for index, item in enumerate(outputList1):
    pass

编辑:由于您的问题标题提到了'列表的列表',我应该指出,在迭代列表时,如果每个列表项本身是可迭代的,则将其拆包成多个变量将起作用。例如:

list = [ ['a', 'b'], ['c', 'd'] ]
for item1, item2 in list:
    print item1, item2
这将输出:
a b
c d
如预期的那样。这与字典的工作方式类似,只是您可以在包含的列表中有两个、三个或任意数量的项。

那不是字典迭代的方式。在终端中尝试一下,你会得到“blah is not iterable”的错误,其中blah是键的类。你所想的是使用dict.items()来迭代键和值,但这并不是默认行为,正如你所说的那样。 - Andrew
我尝试遍历一个包含元组的列表时,出现了相同的错误:lst=[('a','b')] for key, value in lst: 这可能是因为我的第一个元组中有BOM Unicode标记吗? - Hrvoje T
@HrvojeT 是哪个版本的Python?对我来说它很好用 - 如果一个字符串中有BOM,则不应影响元组的可迭代性。 - Carson Myers
@CarsonMyers 我在这里找到了一个解决方案 http://stackoverflow.com/questions/42695716/unpacking-iterables-in-python3/42695799#42695799 无论如何还是谢谢。 - Hrvoje T

11

您忘记使用enumerate了,您应该这样做:

for index,item in enumerate(outputList1) :
  pass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接