如何在Python中将整数转换为单词?

3
写一个函数,它接收一个整数作为输入参数,并返回用单词表示的整数。例如,如果输入是4721,则函数应返回字符串"four seven two one"。请注意,在您返回的字符串中,单词之间应该只有一个空格,并且它们应该全部小写。
以下是代码:
def Numbers_To_Words (number):
    dict = {1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine", 0: "zero"}
    output_str = " "
    list = []

#Main Program
number = 4721
result = Numbers_To_Words (number)
print (result)

我的问题是,如何将数字分离并与我创建的字典进行比较?我知道长度在整数数据类型上不起作用。我知道进一步的逻辑是将键发送到字典并获取它们各自的值。但在此之前,我卡在了将整数数字的数字分离上。


你不能将整数转换为字符串吗(str(number))? 在这种情况下,您还需要更改字典以将字符映射到单词! - luffy
我会尝试实现这个。 - Karan Thakkar
6个回答

9

使用模块进行操作: https://pypi.python.org/pypi/num2words

同时,查看类似的问题: 如何告诉Python将整数转换为单词

您可以安装这些模块并查看实现方式。

但是您的问题可以像这样解决:

def numbers_to_words (number):
    number2word = {'1': "one", '2': "two", '3': "three", '4': "four", '5': "five", '6': "six",
            '7': "seven", '8': "eight", '9': "nine", '0': "zero"}
    return " ".join(map(lambda i: number2word[i], str(number)))


print(numbers_to_words(1234))

4
这显然是一项家庭作业,所以这个答案完全没有帮助。 - Idos

6
有一种比其他方式更简单的方法:
def number_to_words(number)
    words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
    return " ".join(words[int(i)] for i in str(number))

... 或者 return " ".join(words[int(digit)] for digit in str(number)) - 我觉得这个更容易阅读。 - Martin Bonner supports Monica

2
def number_to_words(number):
    dict={"1":"one","2":"two","3":"three","4":"four","5":"five","6":"six","7":"seven","8":"eight","9":"nine","0":"zero"}
    s=""
    for c in str(number):
        s+=dict[c]+" "
    #if it's matter that the string won't conatain
    #space at the end then add the next line:
    s=s[:-1]

    return s

1
你实际上并没有在dict中查找c,而且原帖似乎想要一个列表而不是一个字符串。 - Martin Bonner supports Monica
抱歉,我已经修复了。 - pinogun

1

当你无法导入模块来将数字转换为单词时,这段代码可以帮助你。该代码用于将数字从1到1000(包括1和1000)转换为单词。

def integer_to_english(number):
    if number>=1 and number<=1000:
        a = ['','one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen','twenty ','thirty ','fourty ','fifty ','sixty ','seventy ','eighty ','ninty ']
        if number<=20:
            if number%10==0: return a[number]
            else: return a[number]
        elif number<100:
            b=number-20
            r=b%10
            b//=10
            return a[20+b]+a[r]
        elif number<1000:
            if number%100==0:
                b=number//100
                return a[b]+' hundred'
            else:
                r=number%100
                b=number//100
                if r<=20:
                    return a[b]+' hundred'+' and '+a[r]
                else:
                    r=r-20
                    d=r//10
                    r%=10
                    return a[b]+' hundred'+' and '+a[20+d]+a[r]
        elif number==1000:
            return 'one thousand'
        else:
            return -1

number=789
print(integer_to_english(number))

0
我会使用 re.sub
>>> def Numbers_To_Words (number):
    dict_ = {'1': "one", '2': "two", '3': "three", '4': "four", '5': "five", '6': "six", '7': "seven", '8': "eight", '9': "nine", '0': "zero"}
    return re.sub(r'\d', lambda m: dict_[m.group()] + ' ', str(number)).strip()

>>> print Numbers_To_Words(4721)
four seven two one
>>> print Numbers_To_Words(98765423)
nine eight seven six five four two three

让“可读性至上”见鬼。 - Stop harming Monica
在这种情况下,正则表达式似乎有些过度了。 - GingerPlusPlus
@GingerPlusPlus 好的,你更喜欢哪个解决方案?我可以告诉你它的缺点吗? - Avinash Raj
@AvinashRaj:zondo的答案是我最喜欢的,JRazors'是第二好的。如果你想过滤数字,在map之前通过管道将其传递给filter(str.isdigit) / 在生成器表达式中添加if i.isdigit()子句。它有什么缺点吗? - GingerPlusPlus

0
def number_to_words(number):
    names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    lst = []
    while True:
        lst.insert(0, number % 10) # Prepend
        number /= 10
        if number == 0:    # Do this here rather than in the while condition
           break;          # so that 0 results in ["zero"]

    # If you want a list, then:
    return lst;

    # If you want a string, then:
    return " ".join(lst)       

在 Python 中,将元素添加到列表的开头是比较慢的。更快的方法可能是先将元素添加到末尾,然后再倒序排列。 - GingerPlusPlus
这实际上是我的最初反应 :-),但我决定速度在这里不太重要 - 而可读性是。 (哦,还有感谢您的编辑。正确性更加重要!) - Martin Bonner supports Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接