0

各アルファベットを2つ前のアルファベットに置き換えることにより、文字列を変更しようとしています。たとえば、'a' は 'c' に置き換えられ、'b' は 'd' に置き換えられます。唯一の例外は、'y' を 'a' に、'z' を 'b' に置き換えることです (最初にループバック)。

私はそれのために次のコードを書きました。これは目的を果たしているようですが、出力の書式設定がそれを台無しにしています。

string = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
print string
for i in string:
    if i.isalpha():
        if ord(i)>120:
            print chr(ord(i)-24),
        else:
            print chr(ord(i)+2),
    else: 
        print i

出力:

g fmnc wms bgblr rpylqjyrc gr zw fylb.
i   h o p e   y o u   d i d n t   t r a n s l a t e   i t   b y   h a n d .

期待される出力:

g fmnc wms bgblr rpylqjyrc gr zw fylb.
i hope you didnt translate it by hand.

これを解決するための代替のより迅速なアプローチはありますか?

4

3 に答える 3

3

このprint i,構文は、出力されるものの最後にスペースを追加します。すべての文字をリストに入れ''.join()て最後に ing することで、これを解決できます。

string = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
print string
answer = []
for i in string:
    if i.isalpha():
        if ord(i)>120:
            answer.append(chr(ord(i)-24))
        else:
            answer.append(chr(ord(i)+2))
    else: 
        answer.append(i)
print ''.join(answer)

もちろん、他の人が示唆しているように、string.translateおそらくはるかに簡単です

于 2013-07-23T00:19:20.893 に答える
1

string.translate を使用したソリューションは次のとおりです。

from string import translate, maketrans, ascii_lowercase

s='g fmnc wms bgblr rpylqjyrc gr zw fylb.'

rot2=maketrans(
    ascii_lowercase,
    ascii_lowercase[2:]+ascii_lowercase[:2]
    )

print s.translate(rot2)
于 2013-07-23T00:48:21.537 に答える
0

リスト内包表記のこの恐ろしいろくでなし化を使用することもできます。

message = "g fmnc wms bgblr rpylqjyrc gr zw fylb."
print message
print ' '.join([''.join([chr(((ord(letter)+2) % 122) + int(ord(letter)/121.0)*96) if ord(letter)>96 else letter for letter in word]) for word in message.split()])
于 2013-07-23T00:42:42.037 に答える