你好我已经做了一次直通搜索,然后像往常一样问这个问题。我正在尝试使用字典从一个书面文字到使用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;因为这是我在字典中定义的所有内容,因为这是对理解的考验。
我想我仍然需要一些东西来使字典功能的连接工作,但仍然试图找出它是什么......
答案 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
在计算机科学中,空白是任何字符或系列 表示水平或垂直空间的空白字符 排版。渲染时,空格字符不对应 到可见标记,但通常占据页面上的区域。
好了,现在我们知道,空格就像space
或tab
等。像"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)文档中的大量研究和查找,解决难题以及查看几行代码的时间长。如果你不喜欢它,你永远不会成为程序员。