【问题标题】:Python 3.6 - How to translate a telephone number with wordsPython 3.6 - 如何用单词翻译电话号码
【发布时间】:2018-08-31 05:21:43
【问题描述】:

试图让这个程序将字母转换为数字,以便可以输入带有单词的电话号码并输出数字版本。 (1800GOTJUNK = 18004685865)不确定我哪里出错了,但每个输出只给出最后一个字母的内容,并为所有数字重复它的数字(1800adgjmptw = 18009999999)。任何帮助将不胜感激,谢谢。

def transNum(string):
    number = 1
    for ch in string:
        if ch.lower() in "abc":
            number = 2
        elif ch.lower() in "def":
            number = 3
        elif ch.lower() in "ghi":
            number = 4
        elif ch.lower() in "jkl":
            number = 5
        elif ch.lower() in "mno":
            number = 6
        elif ch.lower() in "pqrs":
            number = 7
        elif ch.lower() in "tuv":
            number = 8
        elif ch.lower() in "wxyz":
            number = 9
    return number


def translate(phone):
    newNum = ""
    for ch in phone:
        if ch in   ["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"]:
            newNum = newNum + str(transNum(phone))
        else:
            newNum = newNum + ch
    return newNum

def main():
    phone = input("enter a phone number")
    noLetters = translate(phone)
    print("The number you entered: ", phone)
    print("Translates to: ", noLetters)

main()

【问题讨论】:

  • 可能你需要在你的 transNum 方法上做ch.lower() in ['a', 'b', 'c']
  • newNum = newNum + str(transNum(phone)) 更改为newNum = newNum + str(transNum(ch))
  • 最简单的方法:noletters = phone.translate(str.maketrans( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", "2223334445556667777888999922233344455566677778889999"))

标签: python


【解决方案1】:

我无法帮助您解决整个问题,但至少可以让您更轻松地进行推理。使用字典将键映射到值,而不是用所有这些 if 杀死一些独角兽。

所以你可以做类似的事情

ch_num_map = {'a': 2, 'b': 2, 'c': 2, 'w': 9, 'z': 9} # you get the idea

那么你可以简单地做:

ch_num_map.get('a')
# output: 2

【讨论】:

  • 虽然这确实是一个解决方案,但它的可读性不如 if-else 结构(没有任何问题)。
【解决方案2】:

str(transNum(phone)) 应该是str(transNum(ch)) 而且 transNum 不需要遍历它的输入,因为它只会保留最后一个数字(它被设计为只有一个字母作为输入)。

【讨论】:

【解决方案3】:

这里的问题是您在 transNum 函数中循环遍历整个字符串。你想要的是传递一个字符并获得它的数字表示。试试这个:

def transNum(ch):
    number = 1
    if ch.lower() in "abc":
        number = 2
    elif ch.lower() in "def":
        number = 3
    elif ch.lower() in "ghi":
        number = 4
    elif ch.lower() in "jkl":
        number = 5
    elif ch.lower() in "mno":
        number = 6
    elif ch.lower() in "pqrs":
        number = 7
    elif ch.lower() in "tuv":
        number = 8
    elif ch.lower() in "wxyz":
        number = 9
    return number


def translate(phone):
    newNum = ""
    for ch in phone:
        if ch in "abcdefghijklmnopqrstuvwxyz"
            newNum = newNum + str(transNum(ch))
        else:
            newNum = newNum + ch
    return newNum

我希望这会有所帮助。

【讨论】:

    【解决方案4】:

    我们来看看这个函数:

    def transNum(string):
        number = 1
        for ch in string:
            if ch.lower() in "abc":
                number = 2
            elif ch.lower() in "def":
                number = 3
            elif ch.lower() in "ghi":
                number = 4
            elif ch.lower() in "jkl":
                number = 5
            elif ch.lower() in "mno":
                number = 6
            elif ch.lower() in "pqrs":
                number = 7
            elif ch.lower() in "tuv":
                number = 8
            elif ch.lower() in "wxyz":
                number = 9
        return number
    

    这个函数的作用是获取一个字符串,遍历它的字符,每次将相应的数字分配给变量number。在循环结束时,它返回变量number。所以这个函数所做的本质上是一堆无用的工作,然后返回 only 字符串中的 last 字符应该对应的数字。您想要的只是将一个字符传递给此函数并摆脱 for 循环。或者,您可以在此函数中创建翻译后的字符串并返回完整的字符串而不是返回数字。

    【讨论】:

      【解决方案5】:

      我认为应该存在一种更 Pythonic 的方式,但至少这应该适用于您的情况

      def transNum(string):
          number = 1
      
          numberElements={
              "a":2,"b":2,"c":2,
              "d":3,"e":3,"f":3,
              "g":4,"h":4,"i":4,
              "j":5,"k":5,"l":5,
              "m":6,"n":6,"o":6,
              "p":7,"q":7,"r":7,"s":7,
              "t":8,"u":8,"v":8,
              "w":9,"x":9,"y":9,"z":9,
          }
      
          for ch in string:
              number = numberElements[ch.lower()]
          return number
      
      def translate(phone):
          newNum = ""
          for ch in phone:
              if ch.lower() in ["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"]:
                  newNum = newNum + str(transNum(ch))
              else:
                  newNum = newNum + ch
          return newNum
      
      def main():
          phone = input("enter a phone number")
          noLetters = translate(phone)
          print("The number you entered: ", phone)
          print("Translates to: ", noLetters)
      

      【讨论】:

      • 你也可以使用list(string.ascii_lowercase)删除["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"]这行你可以在link查看这个
      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      相关资源
      最近更新 更多