Python 实验三

一、实验目的

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}]

拓展知识(列表排序、内置函数用法):

  1. 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的大小,从小到大排序。

  1. sorted(iterable,key=None,reverse=False)

iterable:排序对象,如字符串,列表,元组,字典等可迭代对象。

key:排序依据,通常为函数名,如 abs、str.lower、str.upper 等;或以函数指定可迭代对象中的某个元素来进行排序。

reverse:排序规则,reverse=True 降序, reverse=False 升序(默认)

  1. 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()看了好久才大概看懂怎么运用),需要自己的不断提高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值