第四章 列表、元组和字典 课后练习题

目录

一、列表练习题:

1.操作一个list做增删改查操作(写一个图书管理系统)

2.完成引用复制和非引用复制的一个例子

3.找到两个列表中不同的元素和相同元素

4.数字和字母混合的list中,奇数位元素加1,偶数位加2

5.递归处理嵌套的list

6: 遍历list,但是list中元素的数据类型不定,有可能有嵌套的list,嵌套的tuple,dict等。(没有多重嵌套)

8.1个纯数字的list中,分别输出奇数坐标数字或偶数坐标数字

9.找到序列中最大的元素,自己写算法实现,不能用现有函数

10.返回列表中第二大元素

11.键盘读入一字符串,逆序输出

二、课后练习题:

1. 从键盘输入两个数,并比较其大小,直到输入e/E退出程序

2. 将列表元素交替地作为键和值来创建字典

3. 分别输出字符串中奇数坐标和偶数坐标的字符

4. 将一个字典的 key和value 互换

5. 将一个多重嵌套的列表的元素进行互换,存到另一个同等维度的嵌套列表中,例如:[[1,2,3],[4,5,6]]互换后变成[[1,4],[2,5],[3,6]]

6. 有一个3 x 4的矩阵,要求编程求出其中值最大的那个元素的值,以及其所在的行号和列号,矩阵可以通过嵌套列表来模拟

7. 递归实现嵌套列表求和

8. 打印斐波拉契数列前n项

9. 检查ipV4的有效性,有效则返回True,否则返回False,(提示使用split函数进行分割)

10. 检测密码强度

11. 求两个集合的交集和并集

12. 一个包含多个数字的列表,请使用随机的方式,将每个数字+1后,生成新列表

13. 判断一个字符串是否为回文字符串。所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的。 比如"level" 、“aaabbaaa”

14. 实现合并同类型的有序列表算法,要求不能有重复元素

15. 不区分大小写对包含多个字符串对象的列表进行排序,显示排序后的结果还需要显示大小写不变的原字符串

16.一个数如果恰好等于它的因子之和,这个数就称为完数,例如6的因子为1,2,3,而6=1+2+3,因此6是完数,编程找出1000之内的所有完数,并按6 its factors are 1,2,3这样的格式输出

17.使用二分法实现在一个有序列表中查找指定的元素

18.分离list1与list2中相同部分与不同部分

19.找出一个多维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点

20.写一个函数,识别输入字符串是否是符合 python 语法的变量名(不能数字开头、只能使用数字和字母以 及‘_’)


一、列表练习题:

1.操作一个list做增删改查操作(写一个图书管理系统)

def show_command():
	command_info="""
	欢迎进入图书馆管理系统!按键详情如下:
	1.增加图书
	2.删除图书
	3.更改图书信息
	4.查询图书
	e(E).退出系统(e or E)
	"""
	global library_book_managelist
	while True:
		print(command_info)
		command = input("请选择你的操作:")
		if command == "e" or command == "E": # 退出系统
			print("Bye!!!")
			break
		elif command == "1": # 添加图书
			book_add(library_book_managelist)
		elif command == "2": # 删除图书
			book_del(library_book_managelist)
		elif command == "3": # 修改图书
			book_modify(library_book_managelist)
		elif command == "4": # 查询图书
			book_query(library_book_managelist)
		else:
			print("按键有误,请重新选择您的操作!")


def judge_input_proprity(property):
	"""
	:property:需要判断的输入信息,允许的值为["id","name","author"]
	:return:返回不为空的property,或者返回None
	"""
	while True:
		command = input("请输入图书%s(输入e或E退出!):" % property)
		if property in ["id","name","author"]:
			if command == "e" or command == "E":
				print("退出输入图书%s!!!" % property, end="")
				break
			if len(command) == 0:
				print("图书%s不能为空!请重新填写!" % property)
				continue
					
			else:
				return command
		else:
			print("传入的%s有误!" % property)
			continue


def	book_add(book_list):
	book=[] #一本书包含id,书名,作者
	global no
	book_id = no + 1
	book_name = judge_input_proprity("name")
	if book_name:# 书名合法时
		book_author = judge_input_proprity("author")
		if book_author:  # 作者合法时
			book.append(book_id)
			book.append(book_name)
			book.append(book_author)
			book_list.append(book)
			print("增加图书成功!")
			no += 1
			return book_list
		else:
			print("未增加图书!")
	else:
		print("未增加图书!")


def find_property(book_list,func):
	"""
	:param book_list: 图书列表
    :param func: 值为query时,表示查询功能;值为del时,表示删除功能;值为modify时,表示修改功能;
    :return: 返回查找结果列表,列表中为一个个book子列表;为空时表示未找到
	"""
	result = []
	while True:
		print("*"*30)
		if func=="query":
			print("欢迎进入图书馆查询系统!\n  1.按图书id查询! \n  2.按图书名称查询! \n  3.按图书作查询! \n  e(E).不查询图书!")
		elif func=="del":
			print("欢迎进入图书馆查询系统!\n  1.按图书id删除! \n  2.按图书名称删除! \n  3.按图书作者删除! \n  e(E).不删除图书!")
		command = input("请选择你的操作:")	
		if command == "1":
			book_id= judge_input_proprity("id")
			# print("book_id=",book_id)
			if book_id: # book_id正常
				# print("book_list=",book_list)
				for i in range(len(book_list)):
					if book_list[i][0] == int(book_id):
						result.append(book_list[i])
				# print("result=",result)
				if result: # result 有结果时
					return result
				else:
					print("未找到id为%s的图书"%book_id)
					print("*"*30)
					break
		elif command == "2":
			book_name = judge_input_proprity("name")
			if book_name: # book_name正常
				for i in range(len(book_list)):
					if book_list[i][1] == book_name:
						result.append(book_list[i])
				if result:
					return result
				else:
					print("未找到名称为%s的图书"%book_name)
					print("*"*30)
					break
		elif command == "3":
			book_author = judge_input_proprity("author")
			if book_author: # book_author正常
				for i in range(len(book_list)):
					if book_list[i][2] == book_author:
						result.append(book_list[i])
				if result: 
					return result
				else:
					print("未找到作者为%s的图书"%book_author)
					print("*"*30)
					break
		elif command == "e" or command == "E": 
			print("退出%s图书操作!!!" % func)
			print("*"*30)
			break
		else:
			print("按键有误,请重新选择您的操作!")


def book_del(book_list):
	result = find_property(book_list,"del")
	if result: 
		for res in result:
			print("成功删除图书:%s" %res)
			book_list.remove(res)
		print("*"*30)


def book_query(book_list):
	"""
	:param book_list: 图书列表
    :param command: 代表的命令,1:按id查找 2:按图书名称查找 3:按图书作者查找 e/E:退出操作
    :return: 返回查找结果列表,为空时表示未找到
	"""
	result = find_property(book_list,"query")
	if result: 
		for res in result:
			print("成功查询图书:%s" %res)
		print("*"*30)


def book_modify(book_list):
	result = find_property(book_list,"query")
	if result:# 找到对应id的图书
		print("找到的图书结果集:",result)
		while True:
			print("*"*30)
			print("欢迎进入图书馆查询系统!\n  1.修改图书名称! \n  2.修改图书作者! \n  e(E).不修改图书!")
			command = input("请选择你的操作:")
			if command == "1":
				book_name = judge_input_proprity("name")
				if book_name: # book_name不为None
					for res in result: # 如果有多本书名称相同,一改全改
						res[1] = book_name
						print("修改成功,新图书信息为:%s" % res)
					print("*"*30)
					break
			elif command == "2":
				book_author = judge_input_proprity("author")
				if book_author: # book_author不为None
					for res in result: # 如果有多本书作者相同,一改全改
						res[2] = book_author
						print("修改成功,新图书信息为:%s" % res)
					print("*"*30)
					break
			elif command == "e" or command == "E": 
				print("退出修改图书操作!!!")
				print("*"*30)
				break
			else:
				print("按键有误,请重新选择您的操作!")


no = 0
library_book_managelist = []
show_command()

print(library_book_managelist)


2.完成引用复制和非引用复制的一个例子

一、引用复制

1)使用copy.copy() 

# 浅拷贝:新创建了一个类型跟原对象一样,其内容是原对象元素的引用【即:这个拷贝而来的对象本身是新的,但其内容不是】

print("1)使用copy.copy()")
original_list=[[1,2],'test',400,(5,"tuple",[300])]
copy_list = copy.copy(original_list)
# 改变前
print([id(x) for x in (original_list,copy_list)]) # 不是同一个对象,id不同
# 浅拷贝时,两个对象的子对象id完全一致
print([id(x) for x in original_list])
print([id(x) for x in copy_list])
print("*"*50)

#改变后
original_list.append(88) # 追加不可变类型元素,仅original_list改变
print("original_list=", original_list)
print("copy_list=", copy_list)
print("*"*50)

original_list[0][1]=20 # 修改可变类型子对象,original_list与copy_list均改变
print("original_list=", original_list)
print("copy_list=", copy_list)
print("*"*50)

copy_list[3][2].append('marked') # 修改可变类型子对象,original_list与copy_list均改变
print("original_list=", original_list)
print("copy_list=", copy_list)
print("*"*50)
# 修改后,子对象的id不变
print([id(x) for x in original_list])
print([id(x) for x in copy_list])
print("*"*50)

运行结果 :

1)使用copy.copy()
[2029433671104, 2029433670912]
[2029433671360, 2029433324912, 2029432028336, 2029433396608]
[2029433671360, 2029433324912, 2029432028336, 2029433396608]
**************************************************
original_list= [[1, 2], 'test', 400, (5, 'tuple', [300]), 88]
copy_list= [[1, 2], 'test', 400, (5, 'tuple', [300])]
**************************************************
original_list= [[1, 20], 'test', 400, (5, 'tuple', [300]), 88]
copy_list= [[1, 20], 'test', 400, (5, 'tuple', [300])]
**************************************************
original_list= [[1, 20], 'test', 400, (5, 'tuple', [300, 'marked']), 88]
copy_list= [[1, 20], 'test', 400, (5, 'tuple', [300, 'marked'])]
**************************************************
[2029433671360, 2029433324912, 2029432028336, 2029433396608, 2029432015824]
[2029433671360, 2029433324912, 2029432028336, 2029433396608]
**************************************************

2)使用完全切片[:] or [::]

print("2)使用完全切片[:]or[::]")
original_list=[[1,2],'test',400,(5,"tuple",[300])]
slice_list = original_list[:]
# 改变前
print([id(x) for x in (original_list,slice_list)]) # 不是同一个对象,id不同
# 两个对象的子对象id完全一致
print([id(x) for x in original_list])
print([id(x) for x in slice_list])
print("*"*50)

#改变后
original_list.append(88) # 追加/修改不可变元素,仅original_list改变
print("original_list=", original_list)
print("slice_list=", slice_list)
print("*"*50)

original_list[0][1]=20 # 修改可变类型子对象,original_list与slice_list均改变
print("original_list=", original_list)
print("slice_list=", slice_list)
print("*"*50)

slice_list[3][2].append('marked') # 修改可变类型子对象,original_list与slice_list均改变
print("original_list=", original_list)
print("slice_list=", slice_list)
print("*"*50)
# 修改后,子对象的id不变
print([id(x) for x in original_list])
print([id(x) for x in slice_list])
print("*"*50)

运行结果:

2)使用完全切片[:]or[::]
[2029433670464, 2029433671104]
[2029433670848, 2029433324912, 2029432028336, 2029433396864]
[2029433670848, 2029433324912, 2029432028336, 2029433396864]
**************************************************
original_list= [[1, 2], 'test', 400, (5, 'tuple', [300]), 88]
slice_list= [[1, 2], 'test', 400, (5, 'tuple', [300])]
**************************************************
original_list= [[1, 20], 'test', 400, (5, 'tuple', [300]), 88]
slice_list= [[1, 20], 'test', 400, (5, 'tuple', [300])]
**************************************************
original_list= [[1, 20], 'test', 400, (5, 'tuple', [300, 'marked']), 88]
slice_list= [[1, 20], 'test', 400, (5, 'tuple', [300, 'marked'])]
**************************************************
[2029433670848, 2029433324912, 2029432028336, 2029433396864, 2029432015824]
[2029433670848, 2029433324912, 2029432028336, 2029433396864]
**************************************************

3)使用list()函数

print("3)使用list()函数")
original_list=[[1,2],'test',400,(5,"tuple",[300])]
new_list = list(original_list)

# 改变前
print([id(x) for x in (original_list,new_list)]) # 不是同一个对象,id不同
# 两个对象的子对象id完全一致
print([id(x) for x in original_list])
print([id(x) for x in new_list])
print("*"*50)

#改变后
original_list.append(88) # 追加/修改不可变元素,仅original_list改变
print("original_list=", original_list)
print("new_list=", new_list)
print("*"*50)

original_list[0][1]=20 # 修改可变类型子对象,original_list与new_list均改变
print("original_list=", original_list)
print("new_list=", new_list)
print("*"
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值