一、实验目的
1、掌握集合的基本操作和方法。
2、掌握列表的基本操作和方法。
3、掌握字典的基本操作和方法。
二、实验内容
1、编写程序,生成一个包含20个随机整数的列表,列表中每个元素均位于[0,100] 区间内,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。最后输出该列表。(下标是由0开始的,0是偶数。提示:可以利用切片赋值方式)
2、在一行中输入以空格间隔的若干以字母数字字符组成的字符串(字符串之间不包含其他字符)其他定义一个函数,找出这些字符串的最长的共有前缀并输出如果不存在共有前缀,输出"NOT FOUND"。
样例输入:
water waiter watt
样例输出:
wa
3、第一行输入一个正整数N,随后的N行各输入一个人的姓名和年龄,中间用空格分隔(形如 "Tom 18"),将字符串转为形如 {"name":"Tom","age":18} 的字典,按顺序加入到列表中,得到一个元素为字典的列表,分别根据年龄和姓名对其升序排序输出。
样例输入:
4
Tom 18
Jerry 47
Cat 20
Doge 33
样例输出:
[{'name': 'Tom', 'age': 18}, {'name': 'Cat', 'age': 20}, {'name': 'Doge', 'age': 33}, {'name': 'Jerry', 'age': 47}]
[{'name': 'Cat', 'age': 20}, {'name': 'Doge', 'age': 33}, {'name': 'Jerry', 'age': 47}, {'name': 'Tom', 'age': 18}]
拓展知识(列表排序、内置函数用法):
- list.sort(key=lambda x: (-len(x), x), reverse=True)
将list首先根据长度排列,再按照abc字典顺序排列,最后按照降序排列。
解释:reverse=True按照降序排列,reverse()为将整个列表反过来;
lambda x是指具有排序规则:按照字母从小到大排序,或者按照字符串长度排序;
(-len(x), x)是指首先用x的长度排序,如果长度相同则用出现的先后排序;
两个排序原则,按照-len(x)排序,len(x)表明将长度从小到大排序,那么-len(x),表明将字符串从大到小排序,如果出现两个字符串长度相同的情况,按照第二个x,也就是按照x的大小,从小到大排序。
- sorted(iterable,key=None,reverse=False)
iterable:排序对象,如字符串,列表,元组,字典等可迭代对象。
key:排序依据,通常为函数名,如 abs、str.lower、str.upper 等;或以函数指定可迭代对象中的某个元素来进行排序。
reverse:排序规则,reverse=True 降序, reverse=False 升序(默认)
- zip(*iterables)
iterable指可迭代的,iterables在此可以理解成可迭代的参数,而左上角的*号表示可以输入多个参数。一个生成元组的zip对象(元组迭代器),直到(参数的)输入耗尽为止。
例子:
a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c']
c = ['A', 'B', 'C', 'D', 'E']
z = zip(a, b, c)
print(list(z))
'''
输出:
[(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C')]
'''
三、程序清单
Question 1:
V1:
import random as r
a = []
for i in range(20):
a.append(r.randint(0, 100))
a[0::2] = sorted(a[0::2],reverse=True)
print(a)
V2:(用函数进行封装,用在输出列表时在列表名前加入*就可以不输出[])
import random as r
def generate_random_numbers():
a = []
for _ in range(20):
a.append(r.randint(0, 100))
a[0::2] = sorted(a[0::2],reverse=True)
print(*a)
generate_random_numbers()
Question 2:
str_sum = input("请输入一行以空格间隔的若干以字母数字字符组成的字符串(字符串之间不包含其他字符):")
str_sum = str_sum.split(' ')
lent = len(str_sum)
le = len(str_sum[0])
for i in range(1, lent):
if len(str_sum[i]) < le:
le = len(str_sum[i])
count = 0
cha = ''
for i in range(le):
cha = str_sum[0][i]
for j in range(1,lent):
if cha != (str_sum[j][i]):
break
else:
count += 1
if count == 0:
print("NOT FOUND")
else:
for i in range(count):
print(str_sum[0][i], end='')
V2:(使用函数封装,将一些变量改为更具描述性的替换)
def find_common_prefix():
str_sum = input("请输入一行以空格间隔的若干以字母数字字符组成的字符串(字符串之间不包含其他字符):")
str_sum = str_sum.split(' ')
num_strings = len(str_sum)
min_length = min(len(s) for s in str_sum)
count = 0
for i in range(min_length):
prefix = str_sum[0][i]
if all(s[i] == prefix for s in str_sum[1:]):
count += 1
else:
break
if count == 0:
print("NOT FOUND")
else:
for i in range(count):
print(str_sum[0][i], end='')
find_common_prefix()
Question 3:
V1:
N = eval(input("请输入一个正整数:"))
ch = []
for i in range(N):
new = {}
str_se = input("请输入一个人的姓名和年龄,之间以空格隔开:")
str_se = str_se.split(' ')
new['name'] = str_se[0]
new['age'] = str_se[1]
ch.append(new)
new_1 = sorted(ch,key = lambda x :x['age'],reverse=False)
print(new_1)
new_2 = sorted(ch,key = lambda x :x['name'],reverse=False)
print(new_2)
V2:(将程序用函数封装,提高代码的复用和结构更加完整)
def sort_people():
N = eval(input("请输入一个正整数:"))
ch = []
for i in range(N):
new = {}
str_se = input("请输入一个人的姓名和年龄,之间以空格隔开:")
str_se = str_se.split(' ')
new['name'] = str_se[0]
new['age'] = str_se[1]
ch.append(new)
new_1 = sorted(ch,key = lambda x :x['age'],reverse=False)
print(new_1)
new_2 = sorted(ch,key = lambda x :x['name'],reverse=False)
print(new_2)
sort_people()
四、调试及测试结果
Question 1:
V1:
[99, 70, 98, 15, 87, 20, 86, 97, 82, 15, 52, 0, 48, 29, 38, 77, 15, 4, 10, 24]
进程已结束,退出代码0
V2:
93 42 87 22 85 19 79 49 74 75 66 13 39 30 20 96 8 23 3 48
进程已结束,退出代码0
Question 2:
V1:
请输入一行以空格间隔的若干以字母数字字符组成的字符串(字符串之间不包含其他字符):water waiter watt
wa
进程已结束,退出代码0
V2:
请输入一行以空格间隔的若干以字母数字字符组成的字符串(字符串之间不包含其他字符):water waiter watt
wa
进程已结束,退出代码0
Question 3:
V1:
请输入一个正整数:4
请输入一个人的姓名和年龄,之间以空格隔开:Tom 18
请输入一个人的姓名和年龄,之间以空格隔开:Jerry 47
请输入一个人的姓名和年龄,之间以空格隔开:Cat 20
请输入一个人的姓名和年龄,之间以空格隔开:Doge 33
[{'name': 'Tom', 'age': '18'}, {'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}, {'name': 'Jerry', 'age': '47'}]
[{'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}, {'name': 'Jerry', 'age': '47'}, {'name': 'Tom', 'age': '18'}]
进程已结束,退出代码0
V2:
请输入一个正整数:4
请输入一个人的姓名和年龄,之间以空格隔开:Tom 18
请输入一个人的姓名和年龄,之间以空格隔开:Jerry 47
请输入一个人的姓名和年龄,之间以空格隔开:Cat 20
请输入一个人的姓名和年龄,之间以空格隔开:Doge 33
[{'name': 'Tom', 'age': '18'}, {'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}, {'name': 'Jerry', 'age': '47'}]
[{'name': 'Cat', 'age': '20'}, {'name': 'Doge', 'age': '33'}, {'name': 'Jerry', 'age': '47'}, {'name': 'Tom', 'age': '18'}]
进程已结束,退出代码0
五、实验总结与心得
Question 1:
问题分析:
生成20个随机数字的列表,再对偶数下标降序排列
IPO:使用随机函数,生成20个随机数,过程 将20个随机数放入列表,再将偶数下标进行降序排列,最后输出列表
设计算法:使用random库中的randint函数进行随机数生成,用列表储存,再利用切片和sorted()函数进行偶数下标的降序排列
Question 2:
问题分析:
将输入的以空格为分隔的字符串寻找相同的前缀,并进行输出,若无则输出NOT FOUND
IPO:输入以空格为分隔的字符串,过程:寻找相同前缀,再最后输出前缀或NOT FOUND
算法设计:让用户在键盘上输入,使用split()函数将字符串分开,找出其中最短的字符串,使用for循环从开始遍历,用count计数,若一次循环相同则加1,直到不相同使用break退出循环,再对count进行判断,若为0则输出NOT FOUND 反之则使用循环将相同的前缀输出
Question 3:
问题分析:将输入的分别放入字典,再进行排序
IPO:将输入的名字和对应的年龄放入字典,再将字典放入列表,最后输出两种排序方法对应的结果
算法设计:先初始化一个空列表,用for循环输入每次的姓名和年龄,用split进行分隔,再将其对应的键对应的值放入每次循环时初始化的字典中,在每次循环结束前,将字典放入全局变量的列表中,再使用sorted()函数和lambda函数进行姓名和年龄分别升序排列,最后输出对应的结果
心得:
在本次实验中,我对基本数据类型(如列表,字符串和字典)的操作和处理有了更多的练习,同时使用一些方法可以简化代码,提高效率,并每次将程序用函数进行封装,则可以增加代码的复用,本次实验提供了练习使用列表,字符串,字典等基本数据类型和相应的操作,同时也运用了一些常用的内置函数和库函数,我从中提升了对基本数据类型和常用操作的理解和熟练程度,同时也可以加深对算法设计和代码优化的思考。对函数的命名需要易读懂,对变量名的命名需要易懂这些都能提高代码的可读性。通过本次实验发现了自身的许多不足,如对学过的一些函数无法熟练的运用,思考问题无法反应迅速,对代码的理解不够深刻,自学能力不够(那个sorted()看了好久才大概看懂怎么运用),需要自己的不断提高。