#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 является одним из примеров ситуации, в которой распаковка выполняется для значений в итераторе. Это зависит от того, что выводит итератор 🙂