3

文字と句読点を含む文字列があります。この文字列の文字だけを他の文字に置き換えようとしています。私が開発した関数は、文字を含む文字列に対してのみ機能します。数字が含まれていると論理エラーが発生し、句読点が含まれていると実行時エラーが発生します。関数に句読点を無視させ、文字のみを操作しながらそのままにしておくことができる方法はありますか?

#Create a string variable, ABjumbler generates an alphabet shifted by x units to the right
#ABshifter converts a string using one type to another

textObject = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
smalltext = 'abcde'

alphabet = list(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'])

def ABjumbler(alphabet, x):
    freshset = []
    i=0
    j=0
    while i<(len(alphabet)-x):
        freshset.extend(alphabet[i+x])
        i+=1
    while j<x:
    freshset.extend(alphabet[j]) #extend [0]
    j+=1 #change j = to 1, extends by [1], then by [2], and then terminates when it reaches x
    alphabet = freshset
    return alphabet

newAlphabet = ABjumbler(alphabet, 2)

def ABshifter(text, shiftedalphabet):
    freshset = []
    for letters in text:
        position = text.index(letters)
        freshset.extend(shiftedalphabet[position])
    final = ''.join(freshset)
    return final

print ABshifter(smalltext, newAlphabet)
4

4 に答える 4

2

1 つには、必要なシフトを実行するためのより高速で簡単な方法がいくつかあります。

しかし、あなたの質問に答えるには、次のように単純に追加できます。

if not letter.isalpha():
    continue

str.isalpha()True文字列がアルファベットのみで構成されている場合に返します。

于 2013-08-10T15:22:41.700 に答える
1

1)

x = ['a', 'b', 'c']
print x

y = list(['a', 'b', 'c'])
print y

--output:--
['a', 'b', 'c']
['a', 'b', 'c']

違いはありますか?不要な場合は list() を呼び出さないでください。

2)

x.append('d')
y.extend(['d'])

print x
print y

['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']

違いはありますか?不要な場合は、内部に 'd' を含むリストを作成しないでください。

ABjumbler() 関数全体を 1 行に減らすことができます。

cypher = alphabet[x:] + alphabet[:x]

次のコードを調べます。

import string

x = 23
letters = string.ascii_lowercase

print letters[x:]    #xyz
print letters[:x]    #abcdefghijklmnopqrstuvw
print "-" * 10

cypher = letters[x:] + letters[:x]
print cypher         #xyzabcdefghijklmnopqrstuvw

table = string.maketrans(letters, cypher)

maketrans() 関数は、次のような変換テーブルを構築します。

letters:  abcdefghijklmnopqrstuvwxyz
 cypher:  xyzabcdefghijklmnopqrstuvw

上の文字が文字列で見つかった場合、それらはそのすぐ下の文字に変換されます。

x = "aaa"
print x.translate(table)   #xxx

x = 'abc'
print x.translate(table)   #xyz

x = 'a1bc!'
print x.translate(table)   #x1yz!


x = '123a-b-c!!!!a.b.c456'
print x
print x.translate(table)  

--output:--
123a-b-c!!!!a.b.c456
123x-y-z!!!!x.y.z456

x がアルファベットの長さよりも大きい場合は、次のように記述します。

x = x % len(letters)

サイファーを構築する前に。

import string

def encode_it(str_, letters, offset):
    offset = offset % len(letters)
    cypher = letters[offset:] + letters[:offset]
    table = string.maketrans(letters, cypher)
    return str_.translate(table)
于 2013-08-10T16:09:38.193 に答える
1

これを試してください:

textObject = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
smalltext = 'abcde'

alphabet = list(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'])

def ABjumbler(alphabet, x):
    #for x greater then alphabet length
    if x>=len(alphabet):
        x = x % len(alphabet)
    #return a dictionary like 'a':'c', 'b':'d' etc
    return dict(zip(alphabet, alphabet[x:] + alphabet[:x]))

def ABshifter(letter, alph):
    if letter.isalpha():
        return alph[letter]
    return letter

print "".join(map(lambda x: ABshifter(x, ABjumbler(alphabet,2)), smalltext))
于 2013-08-10T15:53:19.317 に答える
0

定数を使用してstring.ascii_letters、現在の文字が文字かどうかを確認できます。文字列内のすべての文字を 'x' に置き換えるスニペットを次に示します (これはまさにあなたがやりたいことではないことはわかっていますが、始めるには役立つかもしれません)。


    import string

    s = "g fmnc, wma: bgblr?"
    sList = list(s)

    for i in range(0, len(sList)):
        if sList[i] in string.ascii_letters
            j[i] = 'x'
        s = ''.join(j)

    print(s) #'x xxxx, xxx: xxxxx?'
于 2013-08-10T15:28:37.067 に答える