我有一个生成2个项目列表的过程为[datestamp, timestamp]
。
如果我把它放到列表理解中:
[(ds,ts) for ds,ts in process]
我期望的结果是:
[(ds,ts), (ds,ts), (ds,ts)]
我得到的是ValueError: too many values to unpack
。
这是因为for
循环迭代到进程返回的列表中:
for ds,ts in [datestamp, timestamp]
不会分配ds=datestamp
,ts=timestamp
,而是遍历每个字母...如果这样做,它会给(d,t)
,(a,i)
,(t,m)
,(e,e)
等
所以我知道什么是错的......但不知道怎么做这个工作! (是的,这确实感觉很傻......我知道答案真的很简单
答案 0 :(得分:3)
这有效:
process = [[1,2],[3,4],[5,6]]
a = []
for ds, ts in process:
print(ds, ts)
a.append((ds, ts))
以及
z = [(ds, ts) for (ds, ts) in process]
q = [(ds, ts) for ds, ts in process]
如果您收到'ValueError: too many values to unpack'
异常,则进程必须生成包含两个以上项的迭代。
展开列表理解并Handle the exception - 打印除套件中的相关内容以查看可能出现的问题,然后向后工作。
之类的东西process = [[1,2],[3,4],[5,6], [7,8,9]]
a = []
try:
for thing in process:
ds, ts = thing
a.append((ds, ts))
except ValueError as e:
print(e, '\t', thing)
答案 1 :(得分:0)
你需要调试。列表中必定有一些项目没有按预期配对。
你可以找到它们的一种方法是:
problems = [(idx, value) for idx,value in enumerate(process) if len(value)!=2]
这将为您提供列表中的问题索引和项目列表。
如果出现错误 - 例如TypeError
,因为value
对象没有__len__
方法 - 然后将其更改为:
problems = [(idx, value) for idx,value in enumerate(process) if not hasattr(value, '__len__')]