如何以更优雅的方式解决这个Python谜题?

Thi*_*ode 2 python coding-style

我正在处理CoderByte'Python'的问题.时间至关重要,因此代码可能不是真正可读但非常直接.我会对你的方法感兴趣.我的代码适用于某些单词,但使用"句子"进行测试会给我一个不同的结果,就像我们说的那样调试.请评论我的想法!

题 :

使用函数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)
Run Code Online (Sandbox Code Playgroud)

输出:

zddzst -> AEEAUU {wrong}!
sentence -> UfOUfOdf {wrong}!
Run Code Online (Sandbox Code Playgroud)

And*_*ark 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)
Run Code Online (Sandbox Code Playgroud)

例:

>>> LetterChanges('sentence')
'tfOUfOdf'
Run Code Online (Sandbox Code Playgroud)

为了提高效率,我将移动table函数外部的创建,使其仅计算一次,而不是每次函数调用.或者只是硬代码结尾值orignew,就像这样:

import string

def LetterChanges(s):
    t = string.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
                         'bcdEfghIjklmnOpqrstUvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZA')
    return s.translate(t)
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个应该与coderbytes限制一起使用的版本:

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
Run Code Online (Sandbox Code Playgroud)

  • coderbyte很荒谬.提供Python练习,但中性语言,所以你必须编写它像Visual Basic一样... (7认同)