【问题标题】:The tens and hundreds aren't being printed out. How to do this?几十和几百没有被打印出来。这该怎么做?
【发布时间】:2021-09-06 18:28:29
【问题描述】:

这是我的代码:

digit = input("Enter a number to convert to words: ")

units = {
        1:"one", 2:"two", 3:"three", 4:"four", 5:"five", 6:"six", 7:"seven", 8:"eight", 9:"nine",  10:"ten", 11:"eleven", 12:"twelve", 13:"thirteen", 14:"fourteen", 15:"fifteen", 16:"sixteen", 17:"seventeen",
         18:"eighteen",19:"nineteen"}
         
tens =  {

         20:"twenty", 30:"thirty", 40:"fourty", 50:"fifty", 60:"sixty", 70:"seventy", 
         80:"eight", 90:"ninety"}
         
hundred = { 100:"one hundred", 200:"two hundred"
            }

def number_to_words(problem):

    if len(digit) <= 2 and int(digit) in units.keys():
        
         print(units[int(digit)])
            
    elif len(digit) == 2:
            
        split_number = []

        for letters in digit:
            split_number.append(letters)

        if len(split_number) == 2:
            
            first_letter = split_number[0] + '0'
            second_letter = split_number[1]

        for num in tens.keys():
            first_letter = int(first_letter)
            if first_letter == num:
                global split_tens
                split_tens = tens[first_letter]

        for num in units.keys():
            second_letter = int(second_letter)
            if second_letter == num:
                global split_unit
                split_unit = units[second_letter]

        print(split_tens,'-', split_unit)

        
    if len(digit) == 3:
        split_number = []

        for letters in digit:
            split_number.append(letters)
        
        if len(split_number) == 3:
            first_letter = split_number[0] + "00" 
            second_letter = split_number[1] + "0"
            third_letter = split_number[2]
            # print(first_letter, second_letter, third_letter)

        for num in split_number:
            first_letter = int(first_letter)
            second_letter = int(second_letter)
            # if split_number[1] == int(0):
            #     second_letter = "and"
            third_letter = int(third_letter)
            if first_letter == hundred.keys():
                pass
            if second_letter == tens.keys():
                pass
            if third_letter == units.keys():
                pass
        print(hundred[first_letter], "and", tens[second_letter], units[third_letter])

number_to_words(digit)

【问题讨论】:

标签: python dictionary if-statement numbers word


【解决方案1】:

您最多只能使用 3 位数字,因此您只需要您的单位和十位字典。

除此之外,您的代码确实过于复杂。一些明显的问题:

  • 无需遍历digit 并保存到列表中。由于digit 是一个字符串,您可以对其进行索引。
    • 顺便说一句,如果您需要将字符串的每个字符保存到列表中,您可以简单地使用split_number = list(digit)
  • unitstensdict。无需循环它们以匹配键。这违背了使用字典的目的。

试试这样的:

units = {1:"one", 2:"two", 3:"three", 4:"four", 5:"five", 
         6:"six", 7:"seven", 8:"eight", 9:"nine",  10:"ten", 
         11:"eleven", 12:"twelve", 13:"thirteen", 14:"fourteen", 15:"fifteen", 
         16:"sixteen", 17:"seventeen", 18:"eighteen",19:"nineteen"}
         
tens =  {20:"twenty", 30:"thirty", 40:"fourty", 50:"fifty", 60:"sixty", 70:"seventy", 80:"eighty", 90:"ninety"}

def number_to_words(digit):
    if int(digit) in units.keys():
         name = units[int(digit)]
    
    elif int(digit) in tens.keys():
         name = tens[int(digit)]

    elif len(digit) == 2:
        name = tens[int(digit[0]+'0')]+"-"+units[int(digit[-1])]
        
    elif len(digit) == 3:
        if int(digit[1:]) == 0:
            name = units[int(digit[0])]+ " hundred"
        elif int(digit[1:]) in units.keys():
            name = units[int(digit[0])]+ " hundred and " + units[int(digit[1:])]
        elif int(digit[1:]) in tens.keys():
            name = units[int(digit[0])]+ " hundred and " + tens[int(digit[1:])]
        else:
            name = units[int(digit[0])]+ " hundred and " + tens[int(digit[1]+'0')]+"-"+units[int(digit[-1])]
    return name

>>> number_to_words("456")
'four hundred and fifty-six'

>>> number_to_words("78")
'seventy-eight'

>>> number_to_words("820")
'eight hundred and twenty'

编辑:

这样使用递归会更简洁:

roots = {1:"one", 2:"two", 3:"three", 4:"four", 5:"five", 
         6:"six", 7:"seven", 8:"eight", 9:"nine",  10:"ten", 
         11:"eleven", 12:"twelve", 13:"thirteen", 14:"fourteen", 15:"fifteen", 
         16:"sixteen", 17:"seventeen", 18:"eighteen",19:"nineteen", 20:"twenty", 
         30:"thirty", 40:"fourty", 50:"fifty", 60:"sixty", 70:"seventy", 80:"eighty", 90:"ninety"}

def number_to_words(digit):
    if int(digit) in roots.keys():
         return roots[int(digit)]
    
    elif len(digit) == 2:
        return roots[int(digit[0]+'0')]+"-"+number_to_words(digit[-1])
        
    elif len(digit) == 3:
        if int(digit[1:]) == 0:
            return roots[int(digit[0])]+ " hundred"
        else:
            return (roots[int(digit[0])]+ " hundred and "+number_to_words(digit[1:]))
    return None

【讨论】:

  • 谢谢,效果更好,但现在我无法打印出以“0”结尾的数字。例如:10、20、100、300 等。@not_speshal
  • @DanielHao - 谢谢!已编辑!
  • 工作正常,但感觉可以进一步简化 - 也许?递归方式?
  • 是的。我最初使用递归,但看到 OP 的问题和代码,我想,越简单越好。
  • 当我尝试非单位或以零结尾的数字时出现此错误。 RecursionError:调用 Python 对象时超出了最大递归深度。我试图找出原因,因为代码读取正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多