Python 3.x справка по словарю на основе словаря? - PullRequest
0 голосов
/ 14 августа 2011

Я изучаю 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 ]

0 голосов
/ 14 августа 2011

Вызов 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))
0 голосов
/ 14 августа 2011

Я могу только догадываться, но это может быть тем, что вы хотите:

name = input('Name: ')
kalg = {'a':'50075', 'b': '18099', 'c': '89885'}
keylist = [kalg[letter] for letter in name]
print(" ".join(keylist))
...