使用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])
但是当我使用以下代码时:
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)
我收到错误消息:ValueError:没有足够的值要解压(预期为5,得到2)
任何对Python为什么这样做的见解将不胜感激。
PS。以下代码也适用。
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)
答案 0 :(得分:1)
您要遍历rec
,因此rec
中的每个个体值都分配给5个变量。这些值中至少有一个本身就是一个序列(可能是一个字符串),只有2个元素长,并且2个元素不能分配给5个变量。
例如如果Wordpress_Post_List
中的第一项是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)
不要使用另一个for
循环,只需对这5个名称使用赋值:
if i < 5:
li0, li1, li2, li3, li4 = rec
您可以使用itertools.islice()
function对象将迭代限制为前5行,而不是使用enumerate()
和针对i
的测试。因为您知道前五个条目都恰好具有5个元素,所以可以在外循环中使用拆包:
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)
答案 1 :(得分:1)
您的代码正在尝试解压缩每个迭代
for (unpack,my,data,structure) in iterable_of_data_structures:
for li0,li1,li2,li3,li4 in rec:
这要求rec
的每次迭代中必须有5个值;但是,从您以前的代码中我们可以看到,rec
中总共有 5个值。
您可以打开包装而无需迭代:
(li0, li1, li2, li3, li4) = rec