从单词到数字,如在电话中的键使用字典

时间:2014-11-25 21:53:42

标签: python dictionary

你好我已经做了一次直通搜索,然后像往常一样问这个问题。我正在尝试使用字典从一个书面文字到使用python中的字典在电话键盘上的每个字母对应的字母。没有字典就很容易做到这一点,但使用字典虽然代码速度更快,但对我来说却很困惑。帮助将不胜感激。到目前为止,我的代码是

def phone (word):
    d = {'A''B''C':2,'D''E''F':3,'G''H''I':4,'J''K''L':5}
    for i in range (len(word)):
        word.split ()
        return d[word]
我试图使用的词是“ADGJ'就像一个考验。

我得到的错误:

 File "<pyshell#13>", line 1, in <module>
    phone('ADGJ')
  File "C:\Users\Christopher\Desktop\pratice.py", line 195, in phone
    return d[word]
KeyError: 'ADGJ'

我有一个关键错误,我认为word.split会处理任何问题,但事实并非如此。有什么建议吗?

谢谢

我把代码改了一下:我现在有了这个:

def phone (word):
    d = {'A':2, 'B':3}
    word = word.split()
    return d[word]

但是我收到了一个新错误:

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    phone ('ABABBAA')
  File "C:\Users\Christopher\Desktop\pratice.py", line 194, in phone
    return d[word]
TypeError: unhashable type: 'list'

我使用的这个词只是“ABBABABA&#39;因为这是我在字典中定义的所有内容,因为这是对理解的考验。

我想我仍然需要一些东西来使字典功能的连接工作,但仍然试图找出它是什么......

3 个答案:

答案 0 :(得分:1)

这不是有效的Python

d = {'A''B''C':2,'D''E''F':3,'G''H''I':4,'J''K''L':5}

您需要定义每个键值对

d = {
     'A':2, 'B':2, 'C':2, 
     'D':3, 'E':3, ... etc
    }

然后,您可以将单词转换为相应的数字

def getNums(word):
    return ''.join(str(d[i]) for i in word)

>>> getNums('ADGJ')
'2345'

答案 1 :(得分:1)

你的语法有点偏;你不能让字典中的赋值像在switch语句中一样。

试试这个:

d = {'A':2,'B':2,'C':2,'D':3,'E':3,'F':3,'G':4,'H':4,'I':4,'J':5,'K':5,'L':5}

答案 2 :(得分:1)

好的,让我试着帮助你。

这是您当前的代码:

def phone (word):
    d = {'A':2, 'B':3}
    word = word.split()
    return d[word]

第一行定义了你的函数签名,这意味着你有一个名为phone的函数,它接受一个名为word的参数。我的第一个评论是:为函数和变量选择合适的名称。 phone不是一个“函数”,因为函数是一种指令或类似于命令的命令,但从不介意(我认为letters_to_phonenumber会更好)。

第二行定义了一个字典,将'A'映射到2'B'映射到'3'。现在没关系。

第三行用word函数的返回值覆盖您的split()变量,该函数是string类的方法。让我们查看文档:{​​{3}}

  

str.split([sep[, maxsplit]]):   使用sep作为分隔符字符串返回字符串中单词的列表。

由于你显然没有定义sep(arator),我们必须弄清楚这个函数会做什么。进一步阅读说:

  

如果未指定sep或为None,则使用不同的拆分算法   applied:连续空格的运行被视为单个   分隔符,结果将在开始时不包含空字符串   或者如果字符串具有前导或尾随空格则结束。所以,   拆分空字符串或只包含空格的字符串   使用无分隔符返回[]。

因此它会查找字符串中的空格。你不知道什么是空白?我们谷歌:https://docs.python.org/2/library/stdtypes.html#str.split

  

在计算机科学中,空白是任何字符或系列   表示水平或垂直空间的空白字符   排版。渲染时,空格字符不对应   到可见标记,但通常占据页面上的区域。

好了,现在我们知道,空格就像spacetab等。像"ABABBAA"这样的字符串不包含任何空格,所以split()显然只会返回一个列表中只包含一个项目:输入字符串本身。

让我们启动python解释器来检查这个(这是一种常见的调试方式):

>>> 'ABABBAA'.split()
['ABABBAA']

代码中的下一行是return d[word]。所以函数终止于此并返回一个输出值,即d[word]。但是d[word]的价值是多少?好吧,d是一个字典(键'A'和'B'),你试图找到键['ABABBAA']的值。但是你的字典d中没有这样的键,更不用说没有办法为字典创建一个键,因为一个键必须是一个可散列的对象。什么是可清洗物体?我们谷歌:http://en.wikipedia.org/wiki/Whitespace_character

  

hashable:如果对象具有永远不会的哈希值,则该对象是可清除的   在其生命周期中的变化(它需要哈希()方法),并且可以   与其他对象相比(它需要 eq ()或 cmp ()方法)。   比较相等的Hashable对象必须具有相同的哈希值。

     

Hashability使对象可用作字典键和集合   member,因为这些数据结构在内部使用哈希值。

     

所有Python的不可变内置对象都是可清除的,而没有   可变容器(如列表或词典)是。对象   用户定义的类的实例默认是可以清除的;他们   所有比较不相等(除了他们自己),他们的哈希值是   他们的id()。

好的,所以'A'可以播放;-)和任何类型的字符串等,但在这个意义上不是list

那么现在呢?你必须找到一种方法以某种方式分离输入word中的字母。这可以通过切片轻松完成,或者简单地遍历字符串(在Python中,字符串是可迭代的):

for letter in word:
    # this loop will iterate over word and assign each of its letters to
    # the variable `letter`, which you can use in this scope

但我们如何实际返回电话号码?这不起作用:

def phone (word):
    d = {'A':2, 'B':3}
    for letter in word:
        return d[letter]

为什么呢?因为它会停在第一个字母并终止函数(还记得return语句吗?)。

要走的路是收集所有数字,当我们完成时,只需将所有数字放在一起并返回即可。这是处理此类问题的常用方法。我们首先初始化一个列表,我们可以在每次迭代中操作:

def phone (word):
    d = {'A':2, 'B':3}
    digits = []
    for letter in word:
        digits.append(d[letter])
    return digits

大!现在看起来更好:

>>> phone('ABA')
[2, 3, 2]

现在尝试弄清楚如何返回实数而不是列表。

这是顺便说一句。一种程序员的基本工作流程。 (API)文档中的大量研究和查找,解决难题以及查看几行代码的时间长。如果你不喜欢它,你永远不会成为程序员。