0

Python を 1 か月勉強しており、辞書を使用して keygen アプリケーションを作成しようとしています。アイデアは、 name = input('Name: ') の各文字を dict.keys() と比較し、名前の各文字が dict.keys() と等しい結果として dict.values() を出力することでした。それが私が書いたものです:

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 2 をカバーする Mark Luts による「Learning Python」と Python 3 をカバーするポケットの 2 冊の本で Python を勉強しています。ここで、name_textbox と key_textbox のキャプションが一致するかどうかを検証する GUI を使用して、この keygen のソース コードを実際のアプリケーションに実装する方法をお尋ねしたいと思います (私は基本的なものなので、アイデアを提供するために以前に書いたものでした) keygen の出力結果。私は自分でこれをやろうとすることができることを知っています(私はやったが成功しませんでした)が、最初に本(ポケット1)を完成させ、Pythonのすべての主要な側面を理解したいと思います. お待ちいただきありがとうございます。

4

2 に答える 2

0

呼び出しprintは何も「保持」できず(格納する変数がないため)、変数に繰り返し割り当てると、以前の割り当てが置き換えられます。(私はあなたの問題についての推論を理解していません。彼らは完全に異なることをしているので、どのように振る舞うprint(x)かはどのように振る舞うかとは何の関係もありません。)a = x

あなたの質問は、「いくつかの同様の操作からの結果をどのように保持するのですか?」に要約されます。概念レベルでは、答えは「それらをコンテナに入れる」です。しかし、明示的にコンテナに物を入れることは、実際に必要なことよりも面倒です。必要なデータの英語の説明があります:「dict.keys()に等しい名前の各文字のdict.values()」。そして実際、同等のPythonは驚くほど似ています。

もちろん、dict.values()一致する文字ごとに個別のコピーは必要ありません。実際には、文字をのセット全体と比較する必要はありませんdict.keys()。プログラマーとして、私たちはより正確でなければなりません。文字がdictのキーであるかどうか、つまり、それがのセットにあるかどうかをチェックしていますdict.keys()。幸いなことに、そのテストを書くのは簡単です。与えられた文字について、チェックしletter in dictます。文字が見つかったら、対応する値が必要です。通常どおりに検索することでそれを取得しますdict[letter]

次に、必要なものを提供する特別な構文ですべてをまとめます。リスト内包表記です。リストに角かっこを入れて、その中に(入力要素から結果を計算する式)for(入力要素の変数名なので、最初の式で使用できる)in(入力要素のソース)を記述します。 ); また、追加することで、入力要素を同時にフィルタリングすることもできますif(入力要素に何らかの条件を追加します)。

とても簡単です:[kalg[letter] for letter in name if letter in kalg]。私が「要素のソース」として持っていることに注意しnameてください。それが本来あるべき姿だからです。問題の説明でそれを完全に明確に説明しました-なぜdict.keys()既存のforループで反復するのですか?:)

ここで、この式は結果のリストを提供します。たとえば、['foo'、'bar'、'baz']。1つの連続した文字列が必要な場合(dictのすべての値が文字列であると想定しています)、それらを結合する必要があります。幸いなことに、それも簡単です。実際、1つの引数を取る関数に結果を渡すので、角かっこを削除して、物事をかなりきれいに見せることができる特別な構文規則があります。

また、最初に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))
于 2011-08-14T15:42:03.057 に答える
0

私は推測することしかできませんが、これはあなたが望むものかもしれません:

name = input('Name: ')
kalg = {'a':'50075', 'b': '18099', 'c': '89885'}
keylist = [kalg[letter] for letter in name]
print(" ".join(keylist))
于 2011-08-14T15:30:17.040 に答える