python中的map函数抛出错误来解包值

2024-04-23 08:02:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

Tags: 代码inremapforvaluenotkeys
2条回答

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)

问题是您正在使用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()-ing您的punctDict的键,所以您不应该期望在for循环中同时获得键和值

您在这里运行的keys,value实际上并没有访问punctDict的键和值,而是只转义键并尝试拆分字符串(并且成功,因为字符串只有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

相关问题 更多 >