Python数字转单词函数未生效及重复输出问题求助
Python数字转单词函数未生效及重复输出问题求助
第一个问题:最初的number_to_words函数未生效的原因
兄弟,你第一个版本的问题太明显啦——你只定义了number_to_words函数,但从头到尾根本没调用它!看你的代码,最后只做了数字拆分(就是那个把长数字拆成空格分隔片段的操作),完全没把拆分后的数字传给number_to_words去转成单词,所以这个函数当然没起作用咯。
另外,你的number_to_words函数还有几个语法和拼写小问题,提前给你指出来:
ones = [zero','one','two',...]这里zero没加单引号,应该是'zero'tens = ['','',''twenty',...]这里'twenty'前面多了一个单引号,要删掉fourty是拼写错误,正确的是fortyhundreds列表里的'etc'完全不对,应该对应100、200...900的单词,比如'one hundred'、'two hundred'这样
第二个问题:重写后出现重复输出的原因
你第二个版本的重复问题,核心是convert_number_to_word函数里的digits处理逻辑混乱,导致同一个数字被多次转换添加。举个例子,比如你传入234的时候:
- 首先因为是3位数,添加
'two hundred',然后digits.pop(0),此时digits变成[3,4] - 进入
len(digits)>=2的分支:因为3>1,添加'thirty',digits.pop(0),此时digits变成[4] - 接着判断
digits[0] !=0,添加'four',但此时digits还是[4] - 函数继续往下走,进入
if len(digits)==1的分支,又把剩下的4转换成'four'添加了一次,所以就出现了重复的four!
其他数字的重复也是同样的道理,比如567处理完后剩下7,又被多转了一次;89处理完后剩下9,又多转一次,以此类推。
修复方案
给你调整一下convert_number_to_word的逻辑,用字符串切片代替pop操作,每一段数字只处理一次,避免重复:
def convert_number_to_word(number): number_word_mapping = { '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': 'forty', '50': 'fifty', '60': 'sixty', '70': 'seventy', '80': 'eighty', '90': 'ninety', '100': 'one hundred', '200': 'two hundred', '300': 'three hundred', '400': 'four hundred', '500': 'five hundred', '600': 'six hundred', '700': 'seven hundred', '800': 'eight hundred', '900': 'nine hundred', '1000': 'one thousand', } num_str = str(number) words = [] # 处理三位数 if len(num_str) == 3: hundreds_digit = num_str[0] words.append(number_word_mapping[f"{hundreds_digit}00"]) num_str = num_str[1:] # 去掉百位,剩下后两位 # 处理两位数或一位数 if len(num_str) == 2: if num_str in number_word_mapping: # 10-19直接取映射 words.append(number_word_mapping[num_str]) else: # 20以上,拆分十位和个位 tens_digit = num_str[0] words.append(number_word_mapping[f"{tens_digit}0"]) ones_digit = num_str[1] if ones_digit != '0': words.append(number_word_mapping[ones_digit]) elif len(num_str) == 1: if num_str != '0': # 0的话可以根据需求处理,这里暂时忽略 words.append(number_word_mapping[num_str]) print("Converted:", words) return ' '.join(words)
这个修复后的函数逻辑更清晰,每一段数字只会被处理一次,之前的重复问题应该就能解决了。
另外提个小建议:你的process_text函数里用text.replace(match, replacement),如果文本里有多个相同的数字会全部替换,要是想更精准的匹配替换,可以用re.sub配合回调函数,不过当前需求用replace也能满足。
备注:内容来源于stack exchange,提问作者Norbert Yuhas
相关产品推荐
相关产品推荐

