试图编写一个模拟手机拨号的功能

时间:2016-03-22 15:56:32

标签: python python-2.7 python-3.x

我有一个需要编写的函数,叫做dial_up,它获取一个字符串作为输入并返回一个单词作为输出。

e.g def dial_up('999 666 88'):

预期产出:

'YOU'

就像你在旧手机上拨打一个消息一样,但我不知道如何用这样的东西开始:

def dial_up(string):
"""
"""


dict = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrt', '8': 'tuv', '9': 'wxyz'}
for key, value in groupby(string):

此后我有点卡住了。

Obs:我需要我的函数循环所以如果我写(' 2222')它返回我' a'因为它可以追溯到' a' a' - > ' B' - > ' C' - > '一个'

2 个答案:

答案 0 :(得分:2)

num2chars = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrt', '8': 'tuv', '9': 'wxyz'}

def dial_up(string):
    message = ""
    for group in string.split(" "):
        message += num2chars[group[0]][len(group)-1]
    return message

或者:

def dial_up(string):
    return "".join(num2chars[group[0]][len(group)-1] for group in string.split())

答案 1 :(得分:1)

这是一个使用groupby的解决方案。它使用groupby键在字典中找到正确的数字字符串,并使用groupby组的长度来索引该字符串。该组作为迭代器返回,因此我们需要将其转换为列表以获取其长度,并且我们需要减去一个来计算正确的索引,因为索引是从零开始的。然后我们可以通过将该索引减去模拟字典数字字符串的长度来实现循环。

我更改了字典的名称,因为string是标准Python模块的名称。

from __future__ import print_function
from itertools import groupby

decode = {'2': 'ABC', '3': 'DEF', '4': 'GHI', '5': 'JKL', 
    '6': 'MNO', '7': 'PQRT', '8': 'TUV', '9': 'WXYZ'}

def dial_up(digits):
    #return ''.join([decode[key][len(list(value)) - 1]
    result = []
    for key, value in groupby(digits):
        if key == ' ':
            continue
        i = len(list(value)) - 1
        s = decode[key]
        result.append(s[i % len(s)])
    return ''.join(result)

# Test

data = (
    '999 666 88', 
    '33 99 8', 
    '222 2 22', 
    '22 22', 
    '2222', 
    '444 43',
)

for s in data:
    print(s, dial_up(s))

<强>输出

999 666 88 YOU
33 99 8 EXT
222 2 22 CAB
22 22 BB
2222 A
444 43 IGD

在Python 2.6.6上测试过,但它也应该在Python 3上正常工作。