列表推导中的ValueError:需要多个值进行解包

0 投票
2 回答
512 浏览
提问于 2025-04-17 23:23

我在用列表推导式调用一个函数时,遇到了一个错误,错误信息是 ValueError: need more than 1 value to unpack

我定义了一个函数,代码如下:

def dateTimeStrToTimeStamp(dateTimeStr):
    """ Converts a string like '2014-03-07T19:00:00+0000' to 
    timestamp"""
    dateTimeStr, utcStr = dateTimeStr.split('+')
    dateTimeObj = datetime.strptime(dateTimeStr, "%Y-%m-%dT%H:%M:%S")
    date_in_sec = int(time.mktime(dateTimeObj.timetuple()))
    utc_in_sec = int(utcStr[:2]) + int(utcStr[2:])
    return date_in_sec + utc_in_sec

我有一组数据,是这样的一个对象列表:

[{u'id': u'1411421469112603', u'start_time': u'2014-03-09T17:00:00+0000', u'end_time': u'2014-03-09T21:00:00+0000'}, {u'id': u'519204234858802', u'start_time': u'2014-03-08T19:00:00+0000', u'end_time': u'2014-03-08T23:00:00+0000'}, {u'id': u'1393120957624703', u'start_time': u'2014-03-08T19:00:00+0000', u'end_time': u'2014-03-08T23:00:00+0000'}]

当我这样做的时候:

[ dateTimeStrToTimeStamp(event['start_time']) for event in data ]

它给我返回了 ValueError: need more than 1 value to unpack 的错误。

我使用的是 Python 2.7.3,求助,我在这里卡了好几个小时了。

2 个回答

0

这个错误是你自己写的函数引起的。你传入的字符串中有一个没有包含+,所以你的split()方法没有返回两个项目的列表。当你尝试把这个列表拆分成多个部分时,就会出现ValueError: need more than 1 value to unpack的错误。

下面是一个简单的例子,说明了你的错误:

>>> 'ab'.split('-')
['ab']
>>> a,b = 'ab'.split('-')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
1

这一行代码:

dateTimeStr, utcStr = dateTimeStr.split('+')

dateTimeStr 里面没有 '+' 的时候,就会出现这个错误。比如,你可以试试 dateTimeStr, utcStr = 'abc'.split('+'),你会看到同样的错误。所以,你需要做好准备,处理那些没有 UTC 组件的字符串,可能可以把 UTC 偏移量默认设为零。你可以通过捕获异常来检测这个问题:

try:
   dateTimeStr, utcStr = dateTimeStr.split('+')
except ValueError:
   utcStr = '0'

或者,如果输入的字符串没有 UTC 组件对你的函数来说确实是个错误,你可以提供一个更有用的错误提示:

try:
   dateTimeStr, utcStr = dateTimeStr.split('+')
except ValueError as e:
   raise ArgumentError('dateTimeStr {!r} has no UTC component'.format(dateTimeStr)) from e

撰写回答