2016-08-19 13 views
2

私はプログラミングに慣れていません(6週間、 "codecademy"と "python the hard way"でネット上で教えられます)。私は方向なしでコードを書くことを実験し始めた時で、私は2番目のプロジェクトで壁に当たったと決めました。python 2.7辞書からの値でraw_input文字列を置き換えます。

私はraw_input文字列を取り、その中のすべての文字をアルファベットの次の文字に置き換える "秘密のコーダ"を作ろうとしています。私の非常に限られた知識で、私は辞書が行くべき方法であると考えました。

alpha = {"a" : "b", "b" : "c", "c" : "d", "d" : "e", "e" : "f", "f" : "g","g" : "h" 
     , "h" : "i", "i" : "j", "j" : "k", "k" : "l", "l" : "m","m" : "n", "n" : "o" 
     , "o" : "p", "p" : "q", "q" : "r", "r" : "s","s" : "t", "t" : "u", "u" : "v" 
     , "v" : "w", "w" : "x", "x" : "y", "y" : "z", "z" : "a"} 

entry = raw_input("Please write a sentence you want to encode: ") 

def encode(entry, letters): 
    for k, v in letters.iteritems(): 
     if k in alpha: 
      entry = entry.replace(k, v) 
    return entry 
print encode(entry, alpha) 

私は文字列の半分だけ文字が辞書からの正しい値に置き換えられていることである持っている問題:「少し」グーグル助けを借りて、私はこれを書きました。 "a"を "b"、 "b"を "c"として印刷する場合は、 "a"と "b"の両方が "c"として印刷されます。私は完全に迷子に

illustration

私は数字で私の辞書内のすべての値を交換したときに、それは完璧に働いた、ということです。それの要点です

illustration bis

、私は本当に私のコードで間違っているものを得ることはありません。

ご協力いただきありがとうございます。

PS:これは私の最初の投稿でした。うまくいけば、私はすべてのやり方でやりました。

編集:私はまだ評判を得ることができないので、私はあなたの役に立つ答えのためにすべてここにありがとう。今私のミスがどこにあるのかがはっきりとわかります。ここで提供されている情報を利用してコードを修正し、正しく理解するための作業を行います。また、私は、この種の問題を解決するためにはるかに論理的かつ直接的なアプローチがあることがわかります。機能はまだ私には少しぼやけていますが、早い時期には正常です。あなたの印刷機能でencode(entry, alpha)を呼び出す

+0

あなたは、エントリではなく、文字のループに必要な、そしてバック – YOU

+1

「」と各文字に参加し、このシナリオを想像して...あなたは、文字列に 'A'を持っており、あなたのループを、すべての'変更します'' ~'''を '' b'sに変更したのですが、 '' b''を 'c'sに変更します) –

+0

:D私は熱狂が好きです。 Pythonは便利で強力ですので、実際の暗号化ソリューションを使用してメッセージを暗号化することも同様です。Pythonでどのようにシンプルになっているかを見てください。http://stackoverflow.com/questions/30056762/rsa-encryption-and-decryption-in -python :) –

答えて

0
def encode(entry, letters): 
    for k, v in letters.iteritems(): 
     if k in alpha: 
      entry = entry.replace(k, v) 
    return entry 
print encode(entry, alpha) 

、あなたはalpha辞書機能でletters変数であることをencode()関数を渡します。次に、イテレータを使用して、letters変数(alphaディクショナリ)をループします。次に、if文が(alpha辞書であるletters変数から得たもの)がalpha辞書にあるかどうかを確認します。

あなたは、代わりにこのような何かをする必要があります

for k, v in letters.iteritems(): 
    if k in entry: 
     entry = entry.replace(k, v) 
1

問題は、あなたの代わりに文字列の辞書を反復処理しているので、あなたは、元の文字を何度も交換するかもしれないということです。例えば、与えられた入力が'ab'の場合、最初の置換は、になり、の鍵をiteritemsが返す場合は、'cc'になります。ディクショナリは順序付けられていないコレクションなので、返されるアイテムの順序はランダムです。

あなたは結果を作成するために、ソース文字列とjoinを反復するgenerator expressionを使用して問題を解決することができます:

def encode(entry, letters): 
    return ''.join(letters.get(c, c) for c in entry) 

上記の例はgetを呼び出す代わりにalpha doesnのケースを処理するために、インデックス演算子を使用していますソース文字列に文字を含んでいません。 getとインデックス演算子の違いは、getがキーが存在しない場合に返されるデフォルト値である第2引数をとることです。上の例では、デフォルト値は文字そのものです。

+0

OPが初心者であるため、かなりクリーンな解決策(私はそれをupvoted)、それは広い説明を提供するためにクールだろう。 get()メソッドのように、また、アイテムが見つからない場合には、文字から値を取り出す方法、またはデフォルトとして提供されたキーを使用する方法です。 –

+0

@ monchitos82良い点は、少し長い説明を追加しました。 – niemmi

0

辞書がないため、一部の文字( 'a' - > 'b')が置き換えられ、他の文字はスキップされます。

練習のために何をしているのかは、rot(ローテーション)と呼ばれています。最もよく知られているのはrot13です。

あなたが最初に始めたときに物事を書くことは役に立ちますが、ちょうどこれを行うstring.maketransという非常にクールな標準ライブラリ関数があります!

1

Xetnusが正しい場合は、文字の代わりに入力変数をループする必要があります。おそらくこのようなもの

0

他の人は辞書をルックアップとして正しく使用する方法を指摘しています。ただし、文字列をルックアップして再構築する必要がないので、str.translateメソッドを使用することもできます。

import string 

trans = string.maketrans(
    'abcdefghijklmnopqrstuvwxyz', # from... 
    'bcdefghijklmnopqrstuvwxyza' # to 
) 

print raw_input('Please enter something to encode: ').translate(trans) 
+0

これは非常にエレガントでシンプルなやり方です。コードをより複雑な操作で操作できるようになりましたので、間違いなく使用します。私は自分の関数を他の答えで提供された助けを必要とするように働かせます。そしてそれを正しくコード化できるようになると、簡単ですからstr.translateメソッドを使うように切り替えます。それを提案していただきありがとうございます。 – Gorian

関連する問題