Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 试图编写一个模拟手机拨号的函数_Python_Python 2.7_Python 3.x - Fatal编程技术网

Python 试图编写一个模拟手机拨号的函数

Python 试图编写一个模拟手机拨号的函数,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我有一个我需要编写的函数,叫做dial_up,它获取一个字符串作为输入,并返回一个单词作为输出 e.g def dial_up('999 666 88'): 预期产出: 'YOU' 就像你在一部旧手机上拨msg一样,但我不知道如何开始,可能是这样: def dial_up(string): """ """ dict = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrt', '8': 'tuv',

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

e.g def dial_up('999 666 88'):
预期产出:

'YOU'
就像你在一部旧手机上拨msg一样,但我不知道如何开始,可能是这样:

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'->'a'

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
或:


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

我更改了词典的名称,因为
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

在Python2.6.6上测试过,但在Python3上也应该可以正常工作。

如果我尝试写一些东西,比如拨号('2222222'),没有空格,索引超出了范围,是否可以写它,所以当它返回到222时,会返回到零,并再次开始检查,如果这有意义,那么输出应该是'abc'。无论如何,非常感谢您的帮助,这比我想象的要容易得多,我想我需要更多的练习。@EXT:'22222'没有空格是不明确的。为什么输出应该是“ABC”,而不是“CAB”或“BBB”或“CC”等?@PM 2Ring是的,现在自己检查一下,但如果我运行('2223'),它至少应该给我“cdd”或“ce”。我是否需要执行if语句来检查字符串的len,如果大于4,则返回?@PM2Ring关于你的问题,为了明确我需要,我的循环函数('2222')给我'a',因为它是'a'->'b'->'c'->'a'。@EXT:22'是否也应该返回'a',或者它应该返回“b b”?该死的,我希望我能像你一样快地写,我在那里转了两天的头,谢谢你,关于python我有2.7和3.x,所以这不是一个真正的问题。顺便说一句,im sry future模块是在较早版本的python上运行脚本的时候,itertools模块可能不存在?@EXT:from\uuuuuuu future\uuuuuuu import print\u函数的
允许您在python 2中使用
print()
函数。它对
itertools
导入没有影响。如果您尝试在没有
itertools.groupby
的非常旧的Python版本上运行此脚本,那么它将失败。因此,假设我只需要返回值,我可以删除该值下面的所有内容,而不使用future模块TIL。我在使用模块方面很差劲,我不知道其中的大多数模块,我想它来自经验。它使您的工作变得非常简单。@EXT:是的,您可以摆脱
\uuuuuuuuuuuuuuu
导入。您可以删除
#Test
注释下面的内容。您只需要itertools import groupby中的
解码
字典定义和
拨号功能定义。
999 666 88 YOU
33 99 8 EXT
222 2 22 CAB
22 22 BB
2222 A
444 43 IGD