Вызов print
не может «сохранить» что-либо (так как нет переменной для хранения), и многократное присвоение переменной заменяет предыдущие назначения. (Я не понимаю ваших рассуждений о проблеме; поведение print(x)
не имеет ничего общего с поведением a = x
, поскольку это совершенно разные вещи.)
Ваш вопрос сводится к тому, «как сохранить кучу результатов от нескольких аналогичных операций?» и на концептуальном уровне ответ «положить их в контейнер». Но явно помещать вещи в контейнер более утомительно, чем действительно необходимо. У вас есть английское описание данных, которые вы хотите: «dict.values () для каждой буквы имени, равной dict.keys ()». И на самом деле эквивалентный Python поразительно похож.
Конечно, нам не нужна отдельная копия dict.values()
для каждой соответствующей буквы; и мы на самом деле не хотим сравнивать письмо со всем набором dict.keys()
. Как программисты, мы должны быть более точными: мы проверяем, является ли буква ключом слова, т. Е. Находится ли оно в наборе dict.keys()
. К счастью, этот тест написать тривиально: для данного письма мы проверяем letter in dict
. Когда письмо найдено, мы хотим получить соответствующее значение; мы получаем это, просматривая это нормально, таким образом dict[letter]
.
Затем мы завершим все это нашим специальным синтаксисом, который дает нам то, что мы хотим: понимание списка . Мы помещаем скобки для списка, а затем внутри пишем (некоторое выражение, которое вычисляет результат из элемента input) for
(имя переменной для элементов input, поэтому мы можем использовать его в этом первом выражении) in
(источник входных элементов); и мы можем дополнительно фильтровать элементы ввода одновременно, добавив if
(некоторое условие для элемента ввода).
Итак, все достаточно просто: [kalg[letter] for letter in name if letter in kalg]
. Обратите внимание, что у меня name
в качестве «источника элементов», потому что так оно и должно быть. Вы объяснили это совершенно ясно в своем описании проблемы - почему вы перебираете dict.keys()
в ваших существующих циклах for? :)
Теперь это выражение даст нам список результатов, например, ['foo', 'bar', 'baz']. Если нам нужна одна непрерывная строка (я предполагаю, что все значения в вашем dict являются строками), то нам нужно их объединить. К счастью, это тоже легко. Фактически, поскольку мы собираемся передать результаты в функцию, принимающую один аргумент, существует специальное синтаксическое правило, которое позволит нам убрать квадратные скобки, делая вещи немного более аккуратными.
Это также проще, чем вы делаете это, чтобы сначала инициализировать диктовку; идиоматический код Python редко на самом деле нуждается в слове dict
.
Собираем все вместе:
kalg = {'a': '50075', 'b': '18099', 'c': '89885'} # etc.
name = input('Name: ')
print(''.join(kalg[letter] for letter in name if name in kalg))