转换为大写 - Python

时间:2015-02-26 17:30:52

标签: python

我怎样才能让它发挥作用?我试图定义一个返回字符串的函数,该函数是参数的副本,但所有大写的ASCII字母都已转换为小写ASCII字母。我不想使用任何其他内置函数,如.upper()等或字典。

ASCII_LOWERCASE = "abcdefghijklmnopqrstuvwxyz"
ASCII_UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
DECIMAL_DIGITS = "0123456789"

def to_lower(a_string):
    if not a_string:
        return False
    for i in a_string:
        if not (i in ASCII_LOWERCASE or i in ASCII_UPPERCASE):
            return False
        if i in ASCII_LOWERCASE or i in ASCII_UPPERCASE:           
            for i in ASCII_UPPERCASE:            
                return ASCII_LOWERCASE

y=to_lower("ABCabc")
print(y)

打印出来:abcdefghijklmnopqrstuvwxyz

2 个答案:

答案 0 :(得分:3)

您可以根据其项目创建字母字典,然后使用以下函数转换字符串:

>>> d=(dict(zip(ASCII_UPPERCASE,ASCII_LOWERCASE)))
>>> def to_lower(a_string):
...      return ''.join(d[i] if i in d else i for i in a_string)
... 
>>> to_lower("A")
'a'
>>> to_lower("Aa23BC")
'aa23bc'

答案 1 :(得分:1)

您的代码无法工作的部分原因是因为当您在循环中间执行return语句时,该函数将退出,并且不会在其中进一步循环或处理。

通过使用查找表,以下几个工作版本都以基本相同的方式执行您想要的操作。我将它们全部包括在内,因为它不清楚我对你允许使用哪些内置插件的所有人为限制。

请注意,每个版本的函数最后只有一个return语句。

# note these two are same as string.ascii_lowercase and string.ascii_uppercase
ASCII_LOWERCASE = "abcdefghijklmnopqrstuvwxyz"
ASCII_UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def to_lower(a_string):
    chars = []
    for char in a_string:
        if char in ASCII_UPPERCASE:
            chars.append(ASCII_LOWERCASE[ord(char)-ord('A')])
        else:
            chars.append(char)
    return ''.join(chars)

y=to_lower("ABC-123.abc")
print(y)  # --> abc-123.abc

下一个版本从其他两个版本手动创建一个转换表,然后手动将其应用于字符串的每个字符。

TRANSLATE_TABLE = [ASCII_LOWERCASE[v-ord('A')] if chr(v) in ASCII_UPPERCASE else
                   chr(v) for v in range(256)]

def to_lower(a_string):
    return ''.join(TRANSLATE_TABLE[ord(char)] for char in a_string)

y=to_lower("ABC-123.abc")
print(y)  # --> abc-123.abc

此最终版本使用静态字符串方法maketrans()来构建转换表,然后将其与字符串对象参数的translate()方法一起应用,以执行一次调用中所需的任何和所有替换。它是最有效和最短的。

TRANSLATE_TABLE = ''.maketrans(ASCII_UPPERCASE, ASCII_LOWERCASE)

def to_lower(a_string):
    return a_string.translate(TRANSLATE_TABLE)

y=to_lower("ABC-123.abc")
print(y)  # --> abc-123.abc