функция карты в Python, выдающая ошибку для распаковки значений - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь запустить следующую скорость кода

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 ]

1 голос
/ 17 марта 2019

Функция map () выводит итератор, который не может распаковать ключ и кортеж значения.

Чтобы обойти это, вы можете использовать словарное понимание , чтобы сопоставить ключи словаря, чтобы избежать его.

Вот пример:


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)
1 голос
/ 17 марта 2019

Проблема в том, что вы используете 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 обоих re.escape() -d, а скорее только к экранированию ключей и попытке разбить строку (и успешнопотому что строка содержит только 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
...