【问题标题】:Lower function in pythonpython中的底层函数
【发布时间】:2021-04-06 20:23:01
【问题描述】:

我想在python中制作自己的lower函数

就像我们使用的那样:

>>“你好,世界!”.lower()

>>你好,世界!

我想做自己的lower函数

我试过这段代码:

String = "Hello, World!"

def lowerFunction(MyStr):
    if "A" in MyStr:
        MyStr = MyStr.replace("A",'a')
    if "B" in MyStr:
        MyStr = MyStr.replace("B",'b')
    if "C" in MyStr:
        MyStr = MyStr.replace("C",'c')
    if "D" in MyStr:
        MyStr = MyStr.replace("D",'d')
    if "E" in MyStr:
        MyStr = MyStr.replace("E",'e')
    if "F" in MyStr:
        MyStr = MyStr.replace("F",'f')
    if "G" in MyStr:
        MyStr = MyStr.replace("G",'g')
    if "H" in MyStr:
        MyStr = MyStr.replace("H",'h')
    if "I" in MyStr:
        MyStr = MyStr.replace("I",'i')
    if "J" in MyStr:
        MyStr = MyStr.replace("J",'j')
    if "K" in MyStr:
        MyStr = MyStr.replace("K",'k')
    if "L" in MyStr:
        MyStr = MyStr.replace("L",'l')
    if "M" in MyStr:
        MyStr = MyStr.replace("M",'m')
    if "N" in MyStr:
        MyStr = MyStr.replace("N",'n')
    if "O" in MyStr:
        MyStr = MyStr.replace("O",'o')
    if "P" in MyStr:
        MyStr = MyStr.replace("P",'p')
    if "Q" in MyStr:
        MyStr = MyStr.replace("Q",'q')
    if "R" in MyStr:
        MyStr = MyStr.replace("R",'r')
    if "S" in MyStr:
        MyStr = MyStr.replace("S",'s')
    if "T" in MyStr:
        MyStr = MyStr.replace("T",'t')
    if "U" in MyStr:
        MyStr = MyStr.replace("U",'u')
    if "V" in MyStr:
        MyStr = MyStr.replace("V",'v')
    if "W" in MyStr:
        MyStr = MyStr.replace("W",'w')
    if "X" in MyStr:
        MyStr = MyStr.replace("X",'x')
    if "Y" in MyStr:
        MyStr = MyStr.replace("Y",'y')
    if "Z" in MyStr:
        MyStr = MyStr.replace("Z",'z')
    return MyStr


print(lowerFunction(String))

但是这段代码太大了,我们可以用不同的技术来做吗?

提前致谢

【问题讨论】:

  • 作为一个微小的优化,你可以放弃ifs
  • 放弃ifs是什么意思
  • replace 替换所有匹配项——当没有匹配项时它什么也不做。因此,您可以在不事先检查if 的情况下执行replaces。只需删除行并取消缩进其余行即可。
  • 喜欢这个MyStr.replace('A','a')??
  • 提示:小写字母和大写字母的 ASCII 码相差正好 32(或 0x20)。

标签: python string lowercase


【解决方案1】:

Python 具有翻译字符的特殊功能 - str.translate()

创建查找表需要str.maketrans('ABC', 'abc')

但您不必手动编写ABC...Zabc...z,因为您在变量string.ascii_uppercasestring.ascii_lowercase 中有它。

import string

def lower(text):
    lookup = str.maketrans(string.ascii_uppercase, string.ascii_lowercase)
    return text.translate(lookup)

text = lower("Hello, World!")

print(text)

结果

'hello, world!'

当然,这与其他解决方案一样仅适用于 ASCII。

对于 Unicode,它需要 maketrans() 中的所有字符


顺便说一句:使用这个你可以用ROT13加密文本

import string

def rot13(text):
    lookup = str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
                           'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm')
    return text.translate(lookup)

text = ro13("Hello, World!")

结果

'Uryyb, Jbeyq!'

【讨论】:

  • 应该这样调用:text = rot13(.....) 代替吗?请更正。
【解决方案2】:

使用大小写字母列表的另一种解决方案。 The maketrans solution 更快,所以你应该使用它,但这个解决方案更接近原来的解决方案。

def lower_function(my_string):
    for lower, upper in zip(string.ascii_lowercase, string.ascii_uppercase):
        my_string = my_string.replace(upper, lower)
    return my_string

zip 像这样创建大小写对:

list(zip('abc', 'ABC')) 等于 [('a', 'A'), ('b', 'B'), ('c', 'C')]。如果没有list,它会创建一个迭代器,这对于 for 循环来说很好。

与目前为止的其他解决方案一样,它只适用于 ASCII 字符,而 lower 方法也适用于其他解决方案。这将导致所有小写字母:

"CSÖN CSÖN gyűrŰ Arany GYŰRŰ".lower()  # gives "csön csön gyűrű arany gyűrű"

但您可以在zip 部分使用更长的字符列表,例如

zip(string.ascii_lowercase + 'áéíóöőúüűä', string.ascii_uppercase + "ÁÉÍÓÖŐÚÜŰÄ")

但可能还有一些其他问题,例如German scharfes s

【讨论】:

    【解决方案3】:

    此代码可能对您有所帮助

    def lowerFunction(MyStr):
        MyStr=list(MyStr)
        for i in range(len(MyStr)):
            v=ord(MyStr[i])
            if v>=65 and v<=90:
                MyStr[i]=chr(v+32)
        MyStr=''.join(MyStr)
    
        return MyStr
    
    val=lowerFunction('Hello, World!')
    print(val)
    

    【讨论】:

      【解决方案4】:

      你的代码有太多的挑战。

      1. 执行多个替换语句。对于这些步骤中的每一个,python 都会在内部创建一个新字符串。在 Python 中,字符串是不可变的。

      2. if 条件太多。

      def _lowerFunction(char):
          if 65 <= ord(char) <= 90:
              return chr(ord(char) + 32)
          return char
      
      
      def lowerFunction(myStr):
          return ''.join([_lowerFunction(char) for char in myStr])
      
      

      使用ordchr 来检查它是大写还是小写。

      >>> ord('a') # ord example
      97
      >>> ord('A')
      65
      >>> chr(97) # chr example
      'a'
      >>> chr(98)
      'b'
      

      【讨论】:

      • 这很容易!
      • 这是一个聪明的解决方案,但重要的是要注意它仅适用于 ASCII。
      【解决方案5】:

      您可以使用 ascii 来替换字符。

      stri = "Hello, World!"
      lower_stri = ''.join([chr(ord(i)+32) if ord(i) >= 65 and ord(i) <= 90 else i for i in stri ])
      

      这将检查字符是否在大写字母中并用小字母替换它们。

      【讨论】:

      • 这是一个聪明的解决方案,但重要的是要注意它仅适用于 ASCII。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2010-10-29
      • 1970-01-01
      • 2011-05-15
      • 2011-01-12
      相关资源
      最近更新 更多