1

私はCoderByteの「Python」の質問に取り組んでいました。時間は重要であるため、コードは実際には読みにくいかもしれませんが、非常に簡単です。私はあなたのアプローチに興味があります。私のコードはいくつかの単語で機能しますが、「sentence」でテストすると、私たちが話しているようにデバッグして、別の結果が得られます。私の考えにコメントしてください!

質問 :

関数LetterChanges(str)に、渡されたstrパラメーターを取得させ、次のアルゴリズムを使用して変更します。文字列内のすべての文字をアルファベットのそれに続く文字に置き換えます(つまり、cはdになり、zはaになります)。次に、この新しい文字列(a、e、i、o、u)のすべての母音を大文字にして、最後にこの変更された文字列を返します。下のボックスのパラメータテスト機能を使用して、さまざまな引数でコードをテストします。コード内で関数名を変更しないでください。関数の外にコードを配置しないでください。また、returnキーワードを使用して、関数内から回答を返します。

私のコード:

def LetterChanges(str): 
    a = map(chr, range(97, 123))
    b = ['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']
    b.remove('a')
    b.append('a')
    c = dict(zip(a,b))
    v = ['a', 'e', 'i', 'o', 'u']

    k = str
    for i in range(len(str)):
        if str[i] in a:
            k = k.replace(str[i], c[str[i]])

    l = k
    for i in range(len(k)):
        if k[i] in v:
            l = l.replace(k[i], k[i].upper())

    print l

# this call is needed to test your function
# keep this when you submit your code
LetterChanges(str)

出力:

zddzst -> AEEAUU {wrong}!
sentence -> UfOUfOdf {wrong}!
4

4 に答える 4

9

これに使用str.translate()します。次のようになります。

import string

def LetterChanges(s):
    orig = string.letters
    new = string.ascii_lowercase[1:] + 'a' + string.ascii_uppercase[1:] + 'A'
    for vowel in 'aeiou':
        new = new.replace(vowel, vowel.upper())

    table = string.maketrans(orig, new)
    return s.translate(table)

例:

>>> LetterChanges('sentence')
'tfOUfOdf'

効率を高めるために、関数の作成を関数のtable外に移動して、関数呼び出しごとではなく一度だけ計算されるようにします。または、次のようにorigとの終了値をハードコーディングするだけです。new

import string

def LetterChanges(s):
    t = string.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
                         'bcdEfghIjklmnOpqrstUvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZA')
    return s.translate(t)

編集:これは、コーダーバイトの制限で動作するはずのバージョンです:

def LetterChanges(s):
    orig = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    new = 'bcdEfghIjklmnOpqrstUvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZA'
    result = ''
    for c in s:
        if c in orig:
            c = new[orig.index(c)]
        result += c
    return result
于 2012-06-08T21:44:21.737 に答える
2

ちょうど別の解決策

def LetterChanges(letters):
    """
    >>> LetterChanges('abcd')
    'bcdE'

    >>> LetterChanges('ABCD')
    'BCDE'

    >>> LetterChanges('sentence')
    'tfOUfOdf'
    """
    letter_map = {}
    changed_letters = []
    for old_letter in letters:
        if old_letter in letter_map:
            new_letter = letter_map[old_letter]
        else:
            ordinal = ord(old_letter)
            if 65 <= ordinal <= 90:    # ord('A'), ord('Z')
                new_letter = chr((ordinal - 64) % 26 + 65)
            elif 97 <= ordinal <= 122:    # ord('a'), ord('z')
                new_letter = chr((ordinal - 96) % 26 + 97)
            else:
                new_letter = old_letter

            if new_letter in 'aeiou':
                new_letter = new_letter.upper()
            letter_map[old_letter] = new_letter
        changed_letters.append(new_letter)
    return ''.join(changed_letters)
于 2012-06-09T01:11:10.733 に答える
0

次のようなものを試すことができます:

sentence = <your sentence>
c = <your alphabet mapping>
v = <vowels>

def letterMap(x):
    letter = c[x]
    if letter in v:
        return letter.upper()
    else:
        return letter


letterList = map(letterMap, sentence)
answer = "".join(letterList)
于 2012-06-08T22:47:54.210 に答える