Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用for循环时列表上的ValueError_Python_Python 3.x_List_Valueerror - Fatal编程技术网

Python 使用for循环时列表上的ValueError

Python 使用for循环时列表上的ValueError,python,python-3.x,list,valueerror,Python,Python 3.x,List,Valueerror,我在使用for循环处理列表时遇到了一个问题,该循环将列表元素分配给变量,而不是使用列表索引 以下代码正确处理列表,并确认每个子列表有5个元素,所有元素都是字符串类型,并且都有数据: for i, rec in enumerate(Wordpress_Post_List): if i < 5: if i == 0: print(type(rec), ' --> ', len(rec)) print('record ',

我在使用for循环处理列表时遇到了一个问题,该循环将列表元素分配给变量,而不是使用列表索引

以下代码正确处理列表,并确认每个子列表有5个元素,所有元素都是字符串类型,并且都有数据:

for i, rec in enumerate(Wordpress_Post_List): 
    if i < 5:
        if i == 0:
            print(type(rec), ' -->  ', len(rec))
        print('record ',i)
        print('0==', type(rec[0]), '==', rec[0])
        print('1==', type(rec[1]), '==', rec[1])
        print('2==', type(rec[2]), '==', rec[2])
        print('3==', type(rec[3]), '==', rec[3])
        print('4==', type(rec[4]), '==', rec[4])
对于枚举中的i、rec(Wordpress\u Post\u列表):
如果i<5:
如果i==0:
打印(类型(rec),'-->',长度(rec))
打印('记录',i)
打印('0==',键入(rec[0]),'==',rec[0])
打印('1==',类型(rec[1]),'==',rec[1])
打印('2==',类型(rec[2]),'==',rec[2])
打印('3==',类型(rec[3]),'==',rec[3])
打印('4==',键入(rec[4]),'==',rec[4])
但当我使用以下代码时:

for i, rec in enumerate(Wordpress_Post_List): 
    if i < 5:
        for li0,li1,li2,li3,li4 in rec:
            print('0==', type(li0), '==', li0)
            print('1==', type(li1), '==', li1)
            print('2==', type(li2), '==', li2)
            print('3==', type(li3), '==', li3)
            print('4==', type(li4), '==', li4)
对于枚举中的i、rec(Wordpress\u Post\u列表):
如果i<5:
对于rec中的li0、li1、li2、li3、li4:
打印('0==',键入(li0),'==',li0)
打印('1==',类型(li1),'==',li1)
打印('2==',类型(li2),'==',li2)
打印('3=',类型(li3),'=',li3)
打印('4==',键入(li4),'==',li4)
我得到错误:ValueError:没有足够的值来解包(预期为5,得到2)

任何关于Python为什么这样做的见解都将不胜感激

以下代码也适用

for i, rec in enumerate(Wordpress_Post_List): 
    if i < 5:
        li0=rec[0]
        li1=rec[1]
        li2=rec[2]
        li3=rec[3]
        li4=rec[4]
        print('0==', type(li0), '==', li0)
        print('1==', type(li1), '==', li1)
        print('2==', type(li2), '==', li2)
        print('3==', type(li3), '==', li3)
        print('4==', type(li4), '==', li4)
对于枚举中的i、rec(Wordpress\u Post\u列表):
如果i<5:
li0=rec[0]
li1=rec[1]
li2=rec[2]
li3=rec[3]
li4=rec[4]
打印('0==',键入(li0),'==',li0)
打印('1==',类型(li1),'==',li1)
打印('2==',类型(li2),'==',li2)
打印('3=',类型(li3),'=',li3)
打印('4==',键入(li4),'==',li4)

您正在迭代
rec
,因此
rec
中的每个值都被分配给5个变量。这些值中至少有一个本身是序列(可能是字符串),只有2个元素长,2个元素不能分配给5个变量

例如,如果
Wordpress\u Post\u列表中的第一个条目是由5个字符串组成的列表:

['on', 'a', 'distant', 'hazy', 'hill']
然后一个
for
循环接受
'on'
,并将其分配给
for
循环目标。将目标设置为
li0、li1、li2、li3、li4
,由于字符串也是序列,Python尝试将字符
'o'
'n'
分配给5个变量名。这无法工作,因此您会遇到特定的异常:

>>> rec = ['on', 'a', 'distant', 'hazy', 'hill']
>>> for li0,li1,li2,li3,li4 in rec:
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 5, got 2)
您可以使用对象将迭代限制在前5行,而不是使用
enumerate()
和针对
i
的测试。因为您知道前五个条目都有5个元素,所以您可以在外部循环中使用unpacking:

from itertools import islice

for li0, li1, li2, li3, li4 in islice(Wordpress_Post_List, 5):
    print('0==', type(li0), '==', li0)
    print('1==', type(li1), '==', li1)
    print('2==', type(li2), '==', li2)
    print('3==', type(li3), '==', li3)
    print('4==', type(li4), '==', li4)

您的代码正在尝试解包每个迭代

对于数据结构中的iterable\u中的(解包、我的、数据、结构):

对于rec中的li0、li1、li2、li3、li4:

这要求在
rec
的每次迭代中有5个值;但是,我们可以从您以前的代码中看到,
rec
中总共有5个值

无需迭代即可解包:
(li0,li1,li2,li3,li4)=rec

请在您的问题中包括一个在
Wordpress\u Post\u List
中找到的值类型的示例,以及预期的输出。在这个特定的情况下,我们可以根据实际情况猜测出了什么问题,但如果有一个嵌套结构的数据类型的好示例,我们将非常满意,更有效。除了显示异常,通常还需要完整的回溯,这样我们不仅可以看到抛出了什么异常,还可以看到Python是如何到达那里的,以及问题到底发生在哪一行。这不太正确
rec
包含5个值;如果你迭代
rec
,你就是在迭代这5个值,然后试图用rec:
行中的
将你的迭代器当前所在的值解压成5个变量。在enumerate(Wordpress_Post_列表)中将代码“for i,rec:”替换为enumerate中的i,(li0,li1,li2,li3,li4)(Wordpress发布列表):确实有效。我的印象是,我可以使用for语句将列表中的每个元素放入自己的变量中,从而避免使用索引。仍然不理解为什么一个表单可以工作,而另一个表单失败。您需要执行两个操作:迭代操作和解包操作。您只需要迭代
Wordpress\u Post\u list
结构,您只想解压
rec
结构。当您在enumerate(Wordpress\u Post\u list)中为i(li0,li1,li2,li3,li4)执行
时,枚举(Wordpress\u Post\u list)中为i(li0,li1,li2,li3,li4):
您在一条语句中迭代和解压,一切正常。当您为i执行
时,枚举(Wordpress\u Post\u list)中为rec:
你迭代,然后你可以用类似于
(li0,li1,li2,li3,li4)=rec
的东西解包,一切都很好。你的问题代码试图迭代,迭代,解包:迭代太多了。我相信我在这里困惑的根源是代码“在mainlist中用于a,b,c”当mainlist包含多个子列表时工作正常,但我发现如果mainlist中只有一个子列表,则会终止。感谢Martijn提供的帮助和解释。很高兴能提供帮助!如果您觉得它对您有用,请随时使用。:-)
from itertools import islice

for li0, li1, li2, li3, li4 in islice(Wordpress_Post_List, 5):
    print('0==', type(li0), '==', li0)
    print('1==', type(li1), '==', li1)
    print('2==', type(li2), '==', li2)
    print('3==', type(li3), '==', li3)
    print('4==', type(li4), '==', li4)