《Think Python 2e》作业实现(十一): 字典
文章目录
这是什么?
这里是《Think Python 2e》作业实现 !在这里将记录《Think Python 2e》作业的练习记录、终端信息和结果分析。
- 这是《Think Python 2e》哪个版本的作业?
《Think Python:如何像计算机科学家一样思考》第二版。这里主要参考了一个中文网页版《Think Python 2e》中译本。- 可以当成《Think Python 2e》参考答案吗?
这里主要记录了我自己完成作业时所产生的成果及习题总结,基本未参考教材所提供的答案,未免有失规范,参考答案建议还是以 绿茶出版社官方代码 为准。- 不同的解释器版本结果不尽相同,这里用的哪个版本Python解释器?
这里用了Python 3.8.6版解释器,部分用安卓Pydroid 4.01_arm64中的3.8.3版Python解释器,在线解释器用教程推荐的PythonAnywhere中的3.8版Python解释器。
习题11-1:以单词表中单词为键的字典
【习题 】 编写一函数,读取 words.txt 中的单词并存储为字典中的键,值是什么无所谓,然后,你可以使用 in 操作符检查一个字符串是否在字典中,如果你做过习题10-10,可以比较一下 in 操作符 和二分查找的速度
- 练习记录:
import time
fin = open('words.txt')
d = dict()
for line in fin:
n = 0
word = line.strip()
d[word] = n
time_start = time.time()
print('zzzzz' in d)
time_end = time.time()
print(time_end - time_start)
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\new83.py
False
0.0
- 结果分析:在习题中进行了计时,可见查询所用时间有限(这里为
0.0
),与习题10-10中二分查找就不比速度了
习题11-2:更简洁的倒转字典函数代码
【习题 】 查看字典方法 setdefault 的文档,并使用该方法写一个更简洁的 invert_dict
- 练习记录:
def invert_dict(d):
inverse = {}
for key in d:
inverse.setdefault(d[key], []).append(key)
return inverse
d = {'a':1, 'b':2, 'c':3, 'd':1}
print(invert_dict(d))
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\new90.py
{1: ['a', 'd'], 2: ['b'], 3: ['c']}
- 结果分析:
inverse.setdefault(d[key], []).append(key)
语句同时应用了字典的 setdefault() 方法和列表的 append() 方法- 字典的 setdefault() 方法的语法:
D.setdefault(key[,default=None])
- 字典的 setdefault() 方法的参数:
- key – 字典中要查找的键
- default – 可选参数,如果指定键的值不存在时,返回该值,默认为 None
- 字典的 setdefault() 方法返回值:返回指定键的值,如果指定键的值不在字典中返回指定值,默认为 None
习题11-3:备忘录化的Ackermann函数
【习题 】 将习题6-2中的Ackermann函数备忘录化(memoize),看看备忘录化(memoization)是否可以支持解决更大的参数
- 练习记录:
known = {}
def ackermann(m, n):
if (m, n) in known:
return known[m, n]
if m == 0:
return n+1
elif m > 0 and n == 0:
return ackermann(m-1, 1)
elif m > 0 and n > 0:
known[m, n] = ackermann(m-1, ackermann(m, n-1))
return known[m, n]
print(ackermann(3, 4))
print(ackermann(3, 5))
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\new92.py
125
253
- 结果总结:本题练习中,用了下一章的知识 元组,并以元组 (m, n) 作为字典 known 的键
习题11-4:用字典检查列表有否重复元素
【习题 】 编写一个叫做 has_duplicates 的函数,接受一个列表作为参数, 如果一个元素在列表中出现了不止一次,则返回 True , 这个函数不能改变原列表
- 练习记录:
def has_duplicates(t):
d = {}
for k in t:
if k in d:
return True
d[k] = None
return False
t = ['a', 'b', 'c']
print(has_duplicates(t))
t.append('d')
print(has_duplicates(t))
t.append('a')
print(has_duplicates(t))
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\has_duplicates_dic.py
False
False
True
习题11-5:用字典找单词表中的反转词对
【习题 】 两个单词如果反转其中一个就会得到另一个,则被称作“反转对”(参见习题10-11中的 reverse_pair ),编写一程序,读入单词表并找到所有反转对
- 练习记录:
def reverse_pair(t):
d = {}
n = 0
for key in t:
if key[::-1] in d:
n += 1
print(n, key, key[::-1])
d[key] = None
else:
d[key] = None
fin = open('words.txt')
t = []
for line in fin:
word = line.strip()
t.append(word)
reverse_pair(t)
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\new97.py
1 da ad
2 dab bad
3 darb brad
......
395 yaw way
396 yaws sway
397 yeh hey
习题11-6:单词去除首或二字母读音不变
【习题 】 有一个单词满足这个条件,即移除前两个字母中的任意一个,将会得到两个新的由四个字母组成的不一样的单词,且这三个单词发音完全一致,那么这个单词是什么呢
- 练习记录:
#单词读音字典模块
def read_dictionary(filename='c06d.txt'):
d = dict()
fin = open(filename)
for line in fin:
# skip over the comments
if line[0] == '#': continue
t = line.split()
word = t[0].lower()
pron = ' '.join(t[1:])
d[word] = pron
return d
import pronounce #导入单词读音字典模块
def c1(c):
return c[1:]
def c2(c):
return c[0] + c[2:]
d = pronounce.read_dictionary(filename='c06d.txt')
for c in d:
if c1(c) != c2(c):
if c1(c) in d and c2(c) in d:
if d[c] == d[c1(c)] and d[c] == d[c2(c)]:
print(c, c1(c),c2(c),':',d[c])
PS C:\Users\Administrator> python D:\WorkSpace\thinkpython2e\new98.py
scent cent sent : S EH1 N T
- 结果总结:
- 请提前下载单词读音字典模块 pronounce.py 用到的文件 c06d.txt(点此下载),并将其存放于运行 Python 的目录中,本练习为 C:\Users\Administrator
- 请将单词读音字典模块 pronounce.py 存放于程序文件存放的目录,本练习为 D:\WorkSpace\thinkpython2e,不同于文件 c06d.txt 存放的目录