Python 3.x справка по словарю на основе словаря?
Я изучаю Python в течение одного месяца, и я пытаюсь сделать приложение кейген с помощью словаря. Идея заключалась в том, чтобы сравнить каждую букву в name = input('Name: ') с dict.keys() и вывести в качестве результата dict.values () для каждой буквы имени, равной dict.keys(). Вот что я написал:
name = input('Name: ')
kalg = dict()
kalg['a'] = '50075'
kalg['b'] = '18099'
kalg['c'] = '89885'
etc...
Я пытался написать это...
for x in kalg.keys():
print(x)[/code]
... но мне нужно сохранить результат print(x), но я не знаю, как это сделать! Если я сделаю это:
for x in kalg.keys():
a = x
'a' сохраняет только последний ключ словаря:(. Я думал, что это потому, что print(x) печатает каждый ключ dict.keys() на новой строке, но я не знаю, как его решить (я пытался преобразование типа и т.д... но это не сработало).
Пожалуйста, вы можете помочь мне решить эту проблему? Я также не знаю, как сравнить каждую букву строки с другой строкой и вывести dict.values () в качестве результата и в правильной позиции.
Извините за этот глупый вопрос, но я слишком взволнован в написании приложений на Python:)
@ Карл
Я изучаю Python на двух разных книгах: "Изучение Python" Марка Лутса, который охватывает Python 2, и карман, который охватывает Python 3. Я изучил понимание списка - на карманном, и мне удалось написать три других варианта этого кейгена. Теперь я хочу спросить вас, как я могу реализовать исходный код этого кейгена в реальном приложении с графическим интерфейсом, который проверяет, совпадают ли заголовки name_textbox и key_textbox (я исходил из базового, именно так я и писал, просто чтобы дать вам представление) как результат вывода кейгена. Я знаю, что могу попытаться сделать это самостоятельно (я сделал, но с nosuccess), но я хотел бы сначала завершить книгу (карманный) и понять все основные аспекты Python. Спасибо за терпение.
2 ответа
Призвание print
не может "сохранить" что-либо (так как нет переменной для хранения), и многократное присвоение переменной заменяет предыдущие назначения. (Я не понимаю ваших рассуждений о проблеме; как print(x)
ведет себя не имеет ничего общего с тем, как a = x
ведет себя как совершенно разные вещи.)
Ваш вопрос сводится к тому, "как сохранить кучу результатов от нескольких аналогичных операций?" и на концептуальном уровне ответ "положить их в контейнер". Но явно помещать вещи в контейнер более утомительно, чем действительно необходимо. У вас есть английское описание данных, которые вы хотите: "dict.values () для каждой буквы имени, равной dict.keys()". И на самом деле эквивалентный Python поразительно похож.
Конечно, мы на самом деле не хотим отдельную копию dict.values()
за каждую совпадающую букву; и мы на самом деле не хотим сравнивать письмо со всем набором dict.keys()
, Как программисты, мы должны быть более точными: мы проверяем, является ли буква ключом слова, т. Е. Находится ли оно в наборе dict.keys()
, К счастью, этот тест написать тривиально: для данного письма мы проверяем letter in dict
, Когда письмо найдено, мы хотим получить соответствующее значение; мы получаем это, просматривая это нормально, таким образом dict[letter]
,
Затем мы завершим все это с помощью нашего специального синтаксиса, который дает нам то, что мы хотим: понимание списка. Мы ставим скобки для списка, а затем внутри пишем (какое-то выражение, которое вычисляет результат из элемента input) for
(имя переменной для элементов ввода, поэтому мы можем использовать ее в этом первом выражении) in
(источник входных элементов); и мы можем дополнительно фильтровать элементы ввода одновременно, добавив if
(некоторое условие для элемента ввода).
Итак, это достаточно просто: [kalg[letter] for letter in name if letter in kalg]
, Обратите внимание, что у меня есть name
как "источник элементов", потому что так и должно быть. Вы объяснили это совершенно ясно в своем описании проблемы - почему вы повторяете dict.keys()
в ваших существующих петлях?:)
Теперь это выражение даст нам список результатов, например, ['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))
Я могу только догадываться, но это может быть то, что вы хотите:
name = input('Name: ')
kalg = {'a':'50075', 'b': '18099', 'c': '89885'}
keylist = [kalg[letter] for letter in name]
print(" ".join(keylist))