我正在尝试以以下速度运行代码
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)
答案 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)