Python 2.7 用数字书写

Python 2.7 用数字书写,python-2.7,Python 2.7,我需要做一个函数来接收一串数字,输出是与这些数字对应的字母,就像你在手机上发送信息一样。例如,要获取字母“A”,输入应为“2”,要获取字母“B”,输入应为“22”,等等。例如: >>>number_to_word('222 '233' '3'): "CAFE" 如果达到数字限制,程序需要“绕过”数字。例如,字母“A”可以是以下输入:“2”、“2222”、“2222222”等。就像当你在手机上发送短信时,当你通过“C”(即“222”)时,程序会再次转到“A”,使“2222”成为

我需要做一个函数来接收一串数字,输出是与这些数字对应的字母,就像你在手机上发送信息一样。例如,要获取字母“A”,输入应为“2”,要获取字母“B”,输入应为“22”,等等。例如:

>>>number_to_word('222 '233' '3'):
"CAFE"
如果达到数字限制,程序需要“绕过”数字。例如,字母“A”可以是以下输入:“2”、“2222”、“2222222”等。就像当你在手机上发送短信时,当你通过“C”(即“222”)时,程序会再次转到“A”,使“2222”成为键。此外,在输入中,如果字符串为“233”,则程序必须分隔不同的数字,因此此('233')将等于此('2''33') 我做了一本这样的字典:

dic={'2':'A', '22':'B', '222':'C', '3':'D', '33':'E', '333':'F',..... etc}
但我不知道如果输入是“2222”,该如何使程序“循环”,以及如何获取该数字并将其分配给字母“A”。
如果你不明白我在问什么,请随时提问。我很乐意更详细地解释。谢谢。

这似乎给出了期望的结果:

NUMBERS = {'2': 'A', '22': 'B', '222': 'C', '3': 'D', '33':'E', '333': 'F'}

def normalize_number(number):
    for item in number.split():
        if len(set(item)) == 1:
            yield item
        else:
            last = item[0]
            res = [last]
            for entry in item[1:]:
                if entry == last:
                    res.append(entry)
                else:
                    yield ''.join(res)
                    res = [entry]
                    last = entry
            yield ''.join(res)


def number_to_word(number):
    res = []
    for item in normalize_number(number):
        try:
            res.append(NUMBERS[item])
        except KeyError:
            if len(item) >= 4:
                end = len(item) % 3
                if end == 0:
                    end = 3
                res.append(NUMBERS[item[:end]]) 
    return ''.join(res)
测试它:

>>> number_to_word('222 2 333 33')
'CAFE'
>>> number_to_word('222 2 333 3333')
'CAFE'
>>> number_to_word('222 2 333 333333')
'CAFE'
>>> number_to_word('222 2333 3333')
'CAFE'
函数
normalize_number()
将具有不同数字的数字转换为具有相同数字的多个数字:

>>> list(normalize_number('222 2 333 3333'))
['222', '2', '333', '3333']
>>> list(normalize_number('222 2333 3333'))
['222', '2', '333', '3333']
>>> list(normalize_number('222 2 333 53333'))
['222', '2', '333', '5', '3333']

这似乎给出了期望的结果:

NUMBERS = {'2': 'A', '22': 'B', '222': 'C', '3': 'D', '33':'E', '333': 'F'}

def normalize_number(number):
    for item in number.split():
        if len(set(item)) == 1:
            yield item
        else:
            last = item[0]
            res = [last]
            for entry in item[1:]:
                if entry == last:
                    res.append(entry)
                else:
                    yield ''.join(res)
                    res = [entry]
                    last = entry
            yield ''.join(res)


def number_to_word(number):
    res = []
    for item in normalize_number(number):
        try:
            res.append(NUMBERS[item])
        except KeyError:
            if len(item) >= 4:
                end = len(item) % 3
                if end == 0:
                    end = 3
                res.append(NUMBERS[item[:end]]) 
    return ''.join(res)
测试它:

>>> number_to_word('222 2 333 33')
'CAFE'
>>> number_to_word('222 2 333 3333')
'CAFE'
>>> number_to_word('222 2 333 333333')
'CAFE'
>>> number_to_word('222 2333 3333')
'CAFE'
函数
normalize_number()
将具有不同数字的数字转换为具有相同数字的多个数字:

>>> list(normalize_number('222 2 333 3333'))
['222', '2', '333', '3333']
>>> list(normalize_number('222 2333 3333'))
['222', '2', '333', '3333']
>>> list(normalize_number('222 2 333 53333'))
['222', '2', '333', '5', '3333']

似乎你的字典是错的:A没有映射到字符串
2
,而是映射到模式
2[^2]$?
对不起,我是python新手,我不了解这个模式,你能更详细地解释一下吗?谷歌“正则表达式”,但如果字典使用这个模式,我应该给出什么作为参数?因为字典的作用是当程序接收到字符串参数时,它将字符串与同一个键匹配,并接收该键的值。字典似乎是错误的:A不映射到字符串
2
,而是映射到模式
2[^2]$?
很抱歉,我是python新手,我不了解这个模式,你能详细解释一下吗?谷歌“正则表达式”,但如果字典使用这个模式,我应该给出什么作为参数?因为字典的目的是当程序接收到字符串参数时,它将字符串与同一个键匹配,并接收该键的值。非常感谢您的帮助,我将尽最大努力理解您的代码,以便再次完全理解它的工作原理,谢谢。我刚刚注意到,如果输入是2222,那么输出的字母是B,当它应该是A时,我该如何解决这个问题?其他数字也是一样,比如“3333”应该给“D”的时候给“E”。非常感谢你的帮助,我会尽我所能理解你的代码,让我完全理解它是如何工作的,再次感谢你。我刚刚注意到,如果输入是“2222”,输出的字母是“B”,当它应该是“A”,我该如何解决这个问题?其他数字也会出现同样的情况,比如“3333”应该给“D”时给“E”。