python中的map函数抛出错误以解压值

时间:2019-03-17 06:07:29

标签: python python-2.7 dictionary list-comprehension

我正在尝试以以下速度运行代码

punctDict = {'(':' ( ',')':' ) ','\t':'','\n':''}

for keys,value in map(re.escape, punctDict.keys(  )):
    print(keys,value)

它工作正常,并给了我预期的输出结果

但是,如果我尝试使用punctDict = {'(':' ( ',')':' ) ','t':'','n':''}

上面的for循环抛出

异常
ValueError: not enough values to unpack (expected 2, got 1)

2 个答案:

答案 0 :(得分:1)

问题是您正在使用for keys,value来解压缩仅包含一个字符的字符串。观察两者之间的输出差异:

>>> punctDict = {'(':' ( ',')':' ) ','\t':'','\n':''}
>>> map(re.escape, punctDict.keys())
['\\)', '\\(', '\\\t', '\\\n']

这:

>>> punctDict = {'(':' ( ',')':' ) ','t':'','n':''}
>>> map(re.escape, punctDict.keys())
['\\)', '\\(', 't', 'n']

请注意,在第二个示例中,“ t”和“ n”仅变为“ t”和“ n”,并且不能使用逗号将单个字符字符串解包。由于您只是re.escape()-punctDict的键,因此您不应期望在for循环中同时获得键和值。

您在此处运行的keys,value实际上并没有访问punctDict -d的re.escape()的键和值,而是仅转义了键并试图分割字符串(之所以成功,是因为该字符串只有2个字符。

如果您对此进行比较,就会看到相同的行为:

>>> firstPart, secondPart = 'xy'
>>> firstPart
'x'
>>> secondPart
'y'

与此:

>>> firstPart, secondPart = 'x'

Traceback (most recent call last):
  File "<pyshell#60>", line 1, in <module>
    firstPart, secondPart = 'x'
ValueError: need more than 1 value to unpack

甚至是这个:

>>> firstPart, secondPart = 'xyz'

Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    firstPart, secondPart = 'xyz'
ValueError: too many values to unpack

答案 1 :(得分:1)

map() function输出一个迭代器,该迭代器无法解包为键和值元组。

要解决此问题,您可以使用dictionary comprehension来映射字典键以对其进行转义。

这里是一个示例:


import re

punctDict = {
    '(': ' ( ',
    ')':' ) ',
    '\t':'',
    '\n':''
}

escaped_punct_dict = { re.escape(key) : value for (key,value) in punctDict.items() }

for keys, value in escaped_punct_dict.items():
    print(keys,value)