《Think Python 2e》作业实现(十一): 字典

《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 存放的目录
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值