List comprehension ValueError:要解压缩的值太多

时间:2017-10-27 14:22:12

标签: python

我有一个生成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=datestampts=timestamp,而是遍历每个字母...如果这样做,它会给(d,t)(a,i)(t,m)(e,e)

所以我知道什么是错的......但不知道怎么做这个工作! (是的,这确实感觉很傻......我知道答案真的很简单

2 个答案:

答案 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__')]