функция отображения в python выдает ошибку при распаковке значений

#python #python-2.7 #dictionary #list-comprehension

#python #python-2.7 #словарь #список-понимание

Вопрос:

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

 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)
  

Ответ №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 обоих 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
  

Ответ №2:

функция 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. функция map() выводит итератор, который не может распаковать в кортеж ключей и значений. — В общем, да, но первый ввод OP является одним из примеров ситуации, в которой распаковка выполняется для значений в итераторе. Это зависит от того, что выводит итератор 🙂