【头歌-Python】列表自学引导

禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
参考教程:B站视频讲解——https://space.bilibili.com/3546616042621301

第1关:输入数据创建列表

任务描述
本关任务:编写一个能将用户输入的数据加入到列表中的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 创建空列表
  2. 向列表中增加数据

创建空列表

  1. list()函数可以创建一个空列表
score_ls = list()  # 创建一个空列表,命名为score_ls,_ls表示对象为列表类型
  1. []一对空的方括号可以表示一个空列表
score_ls = []  # 创建一个空列表,命名为score_ls,_ls表示对象为列表类型

向列表中增加数据
ls.append(x)方法可以向列表ls末尾增加一个数据 x,原地操作,无返回值 此方法最方便,本关任务推荐使用此方法。
示例如下:

score_ls = []        # 创建一个空列表
score_ls.append(99)  # 只修改原列表对象,无需赋值操作,参数是要加入的元素
print(score_ls)

输出:[99]

  1. ls.extend([x])方法可以向列表ls末尾增加一个列表 [x],当列表只有一个元素时,结果与append()相同,原地操作,无返回值

示例如下:

score_ls = []          # 创建一个空列表
score_ls.extend([99])  # 只修改原列表对象,无需赋值操作,注意参数是列表
print(score_ls)

输出:[99]

  1. ls + [x]方法可以向列表ls末尾增加一个数据 x,返回一个新的列表对象

示例如下:

score_ls = []               # 创建一个空列表
score_ls = score_ls + [99]  # 两个列表拼接,结果是新对象,需要赋值
print(score_ls)

输出:[99]

10位评委为参加程序设计创意赛的选手打分,评分规则是不允许弃权,评分在0-10分之间,包含0和10。
每位评委打出分数后,记录员将该分数输入计算机中,所有分数都以浮点数类型存放在同一个列表中。输出包含全部成绩的列表。

编程要求
根据提示,在右侧编辑器补充代码,使程序能依次接收用户输入的10个成绩,将成绩置于列表中输出。

测试说明
平台会对你编写的代码进行测试:

测试输入:

8.9
10
9.3
9.6
8.4
9.8
9.9
8.9
8.2
10

预期输出:

[8.9, 10.0, 9.3, 9.6, 8.4, 9.8, 9.9, 8.9, 8.2, 10.0]

提示:
加入列表时数据要转浮点数,要求用float()函数,以保持所有数据一致性表示为浮点类型,不可用eval()

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
score_is=[]
for i in range(10):
    n=float(input())
    score_is.append(n)
print(score_is)

第2关:计算每位选手的成绩

任务描述
本关任务:编写一个能对列表中的数据进行统计分析的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 序列的通用操作

序列的通用操作

  1. max(ls)函数可以返回列表ls中的最大值
score_ls = [9.8, 8.6, 9.3, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
print(max(score_ls))  # 10
  1. min(ls)函数可以返回列表ls中的最小值
score_ls = [9.8, 8.6, 9.3, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
print(min(score_ls))  # 5.8
  1. sum(ls)函数可以返回列表ls数值元素的和
score_ls = [9.8, 8.6, 9.3, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
print(sum(score_ls))  # 86.89999999999999
  1. len(ls)函数可以返回列表ls中元素的数量,或者说返回列表长度
score_ls = [9.8, 8.6, 9.3, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
print(len(score_ls))  # 10
  1. 计算列表ls中的数值元素的平均值
score_ls = [9.8, 8.6, 9.3, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
print(sum(score_ls)/len(score_ls))  # 8.69

10位评委为参加程序设计创意赛的选手打分,评分规则是不允许弃权,评分在0-10分之间,包含0和10。
每位评委打出分数后,记录员将该分数输入计算机中,所有分数都以浮点数类型存放在同一个列表中。
先输出包含全部成绩的列表,再输出评分中的最高分、最低分和平均分,严格保留小数点后3位。

编程要求
根据提示,在右侧编辑器补充代码,使程序能依次接收用户输入的10个成绩,将成绩置于列表中输出;再计算并输出成绩中的最高分、最低分和的平均分(输出时严格保留小数点后3位数字)。

测试说明
平台会对你编写的代码进行测试:

测试输入:

8.9
10
9.3
9.6
8.4
9.8
9.9
8.9
8.2
10

预期输出:

[8.9, 10.0, 9.3, 9.6, 8.4, 9.8, 9.9, 8.9, 8.2, 10.0]
最高分10.000,最低分8.200,平均分9.300

提示:
加入列表时数据要转浮点数,要求用float()函数,以保持所有数据一致性表示为浮点类型,不可用eval()

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
score=[]
for i in range(10):
    n=float(input())
    score.append(n)
print(score)
print(f'最高分{max(score):.3f},最低分{min(score):.3f},平均分{sum(score)/len(score):.3f}')

第3关:去除一个最高分和一个最低分

任务描述
本关任务:编写一个能对列表中的数据进行修改的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 查找列表元素
  2. 删除列表元素

查找列表元素

  1. ls.index(x)函数可以返回列表ls中元素x的首次出现位置序号,若x 在列表中不存在,则返回一个异常
score_ls = [9.8, 9.3, 10, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
i = score_ls.index(max(score_ls))  # 返回最大值 首次出现的位置序号
print(i)                           # 2

删除列表元素

  1. ls.remove(x)函数可以删除列表ls中的元素x,x有多个时,只删除第一个
score_ls = [9.8, 8.6, 9.3, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
score_ls.remove(max(score_ls))  # 删除列表score_ls中第一次出现的最大值
print(score_ls)  # [9.8, 8.6, 9.3, 9.3, 9.4, 5.8, 7.9, 8.2, 8.6]
  1. ls.pop(i)函数可以删除列表ls中序号为i的元素x
score_ls = [9.8, 9.3, 10, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
i = score_ls.index(max(score_ls))  # 返回最大值 首次出现的位置序号
score_ls.pop(i)  # 删除列表score_ls中第一次出现的最大值
print(score_ls)  # [9.8, 9.3, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]

10位评委为参加程序设计创意赛的选手打分,评分规则是不允许弃权,评分在0-10分之间,包含0和10。
每位评委打出分数后,记录员将该分数输入计算机中,所有分数都以浮点数类型存放在同一个列表中。
为了评审更加公平,避免评委恶意差评或故意打高分,设置规则:去除一个最高分和一个最低分以修正评分,然后重新计算成绩。
先输出修正前和修正后成绩列表,再输出修正后评分中的最高分、最低分和平均分,严格保留小数点后3位。

编程要求
根据提示,在右侧编辑器补充代码,使程序能依次接收用户输入的10个成绩,将成绩置于列表中输出;再根据规则对成绩进行修正,输出修正后成绩列表,计算并输出成绩中的最高分、最低分和的平均分(输出时严格保留小数点后3位数字)。

测试说明
平台会对你编写的代码进行测试:

测试输入:

8.9
10
9.3
9.6
8.4
9.8
9.9
8.9
8.2
10

预期输出:

[8.9, 10.0, 9.3, 9.6, 8.4, 9.8, 9.9, 8.9, 8.2, 10.0]
[8.9, 9.3, 9.6, 8.4, 9.8, 9.9, 8.9, 10.0]
最高分10.000,最低分8.400,平均分9.350

提示:

  1. 当最高分或最低分有多个时,各只删除一个
  2. 删除元素后列表长度变短

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
score=[]
for i in range(10):
    n=float(input())
    score.append(n)
print(score)
score.remove(max(score))
score.remove(min(score))
print(score)
print(f'最高分{max(score):.3f},最低分{min(score):.3f},平均分{sum(score)/len(score):.3f}')

第4关:计算中位数成绩

任务描述
本关任务:编写一个能计算列表中的数据的中位数的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 列表元素排序
  2. 中位数计算

列表元素排序

  1. ls.sort(reverse=False)方法对列表ls中元素进行排序,无参数时,默认升序排序,reverse=True时降序排序,无返回值,无新对象产生
score_ls = [9.8, 9.3, 10, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
score_ls.sort()  # 返回最大值 首次出现的位置序号
print(score_ls)  # 输出排序后的列表
# [5.8, 7.9, 8.2, 8.6, 9.3, 9.3, 9.4, 9.8, 10, 10] 
  1. sorted(ls,reverse=False)函数对参数中的列表ls中元素进行排序,无参数时,默认升序排序,reverse=True时降序排序,返回值为排序后的列表,新对象
score_ls = [9.8, 9.3, 10, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
new_score_ls = sorted(score_ls)  # 返回最大值 首次出现的位置序号
print(score_ls)  # 原列表中元素顺序不变
# [9.8, 9.3, 10, 9.3, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
print(new_score_ls)  # 输出排序后新产生的列表
# [5.8, 7.9, 8.2, 8.6, 9.3, 9.3, 9.4, 9.8, 10, 10]            

中位数计算

  1. 中位数是按顺序排列的一组数据中居于中间位置的数。
    有一组从小到大排序的n+1个数据:x0, x1, x2, …, xn;

则当n为奇数时,中位数为序号居中的那个值:m0.5 = xn/2

score_ls = [9.8, 9.3, 10, 9.9, 9.4, 5.8, 10, 8.2, 8.6]
score_ls.sort()  # 列表升序排序
print(score_ls)  # 输出排序后的列表
# [5.8, 8.2, 8.6, 9.3, 9.4, 9.8, 9.9, 10, 10]
median = score_ls[4]  # 长度为奇数时,中间一个值是中位数
print(median)  # 9.4

当n为偶数时,中位数中居中的两个数的平均值m0.5 = (xn/2-1 + xn/2)/2

score_ls = [9.8, 9.3, 10, 9.1, 9.4, 5.8, 7.9, 10, 8.2, 8.6]
score_ls.sort()  # 列表升序排序
print(score_ls)  # 输出排序后的列表
# [5.8, 7.9, 8.2, 8.6, 9.1, 9.3, 9.4, 9.8, 10, 10]
median = (score_ls[4]+score_ls[5])/2  # 长度为偶数时,中间两个值的平均数
print(median)  # 9.2

10位评委为参加程序设计创意赛的选手打分,评分规则是不允许弃权,评分在0-10分之间,包含0和10。
每位评委打出分数后,记录员将该分数输入计算机中,所有分数都以浮点数类型存放在同一个列表中。
为了评审更加公平,避免评委恶意差评或故意打高分,设置规则:去除一个最高分和一个最低分以修正评分,然后重新计算成绩。
先输出修正前的列表和修正后升序排序的列表,再输出修正后评分中位数,严格保留小数点后3位。

编程要求
根据提示,在右侧编辑器补充代码,使程序能依次接收用户输入的10个成绩,将成绩置于列表中输出;再根据规则去掉一个最高分和一个最低分升序排序输出,计算并输出成绩中位数(输出时严格保留小数点后3位数字)。

测试说明
平台会对你编写的代码进行测试:

测试输入:

8.9
10
9.3
9.6
8.4
9.8
9.9
8.9
8.2
10

预期输出:

[8.9, 10.0, 9.3, 9.6, 8.4, 9.8, 9.9, 8.9, 8.2, 10.0]
[8.4, 8.9, 8.9, 9.3, 9.6, 9.8, 9.9, 10.0]
去掉最高分和最低分后,中位数成绩为:9.450

提示:

  1. 此题中成绩数量为偶数

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
score=[]
for i in range(10):
    n=float(input())
    score.append(n)
print(score)
score.remove(max(score))
score.remove(min(score))
newscore=sorted(score)
print(newscore)
median=(newscore[3]+newscore[4])/2
print(f'去掉最高分和最低分后,中位数成绩为:{median:.3f}')

第5关:去除弃权评委成绩

任务描述
本关任务:编写一个能去除列表中的空字符串的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 查找并删除空字符串元素
  2. 改变列表元素类型

查找并删除空字符串元素
x in ls:成员测试可以检测元素x是否在列表ls中存在。
ls.remove(x)方法可以移除列表中第一个与x相同的元素,若x在列表中不存在,则返回一个异常。

  1. 错误用法,不用循环只能删除第一个同值元素:
score_ls = ['9.8', '', '', '', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
if '' in score_ls:       # 如果空字符串在列表元素中存在
    score_ls.remove('')  # 只能删除第一个同值元素,后面空字符串不会删除
print(score_ls)          # ['9.8', '', '', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
  1. 错误用法,用for循环也会漏删元素:
score_ls = ['9.8', '', '', '','9.4', '5.8', '7.9', '10', '8.2', '8.6']
for i in score_ls:          # 遍历列表
    if i == '':             # 如果当前字符是字符串
        score_ls.remove(i)  # 列表长度变短,for遍历语句会跳过当前字符后一个字符
print(score_ls)             # ['9.8', '', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
  1. 正确用法,用while循环删除全部同值元素::
score_ls = ['9.8', '', '', '', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
while '' in score_ls:    # 循环测试空字符串在列表中是否存在,直至列表中不存在字符串时退出循环
    score_ls.remove('')  # 移除第一个同值元素
print(score_ls)          # ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6']

改变列表元素类型

  1. map()函数
    list(map(str, ls))函数可以将列表ls中的每个元素的类型都转为元素是字符串类型的列表。
    list(map(float, ls))函数可以将列表ls中的每个非空字符串元素的类型都转为元素是浮点类型的列表,列表中有空字符串时不可用此方法。
score_ls = ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
print(list(map(float, score_ls)))  
# [9.8, 9.4, 5.8, 7.9, 10.0, 8.2, 8.6]
score_ls = [9.8, 9.4, 5.8, 7.9, 10.0, 8.2, 8.6]
print(list(map(str, score_ls)))    
# ['9.8', '9.4', '5.8', '7.9', '10.0', '8.2', '8.6']
  1. 列表推导式 列表推导式也可以转换不包含空字符串元素的列表元素的类型
score_ls = ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
print([float(x) for x in score_ls])
# [9.8, 9.4, 5.8, 7.9, 10.0, 8.2, 8.6]
score_ls = [9.8, 9.4, 5.8, 7.9, 10.0, 8.2, 8.6]
print([str(x) for x in score_ls])  
# ['9.8', '9.4', '5.8', '7.9', '10.0', '8.2', '8.6']
  1. 带if列表推导式 列表推导式中可以用if表达式过滤掉不符合规则的元素,本关中用此方法时,不需要先删除列表中的空字符串。
score_ls = ['9.8', '', '', '', ' 9.4', '5.8', '7.9', '10', '8.2', '8.6']
print([float(x) for x in score_ls if x != ''])
# [9.8, 9.4, 5.8, 7.9, 10.0, 8.2, 8.6]

10位评委为参加程序设计创意赛的选手打分,评分规则是允许弃权,有效评分在0-10分之间,包含0和10。
每位评委打出分数后,记录员将该分数输入计算机中,所有分数都以字符串类型存放在同一个列表中,弃权时直接输入回车,此时获取的是空字符串。
为了评审更加公平,避免评委恶意差评或故意打高分,设置规则:去除弃权成绩,输出查看成绩,再将其余成绩转为数值类型,再去除一个最高分和一个最低分以修正评分,然后重新计算成绩。
先输出修正后成绩列表,再输出修正后评分中的最高分、最低分和平均分,严格保留小数点后3位。

编程要求
根据提示,在右侧编辑器补充代码,使程序能依次接收用户输入的10个成绩,将成绩以字符串类型置于列表中;去除列表中的空字符串元素后,将其他成绩转数值类型,再根据规则对列表中的成绩进行修正,输出修正后成绩列表,计算并输出成绩中的最高分、最低分和的平均分(输出时严格保留小数点后3位数字)。

测试说明
平台会对你编写的代码进行测试:

测试输入:
(测试程序时请复制公开的测试用例中的输入)

8.9
10
 
 
 
9.8
9.9
8.9
8.2
10

预期输出:

[8.9, 9.8, 9.9, 8.9, 10.0]
10.000, 8.900, 9.500

提示:

  1. 当最高分或最低分有多个时,各只删除一个
  2. 删除元素后列表长度变短

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
score_ls = []
for i in range(10):
    a = input()
    score_ls.append(a) 
print(score_ls)
while '' in score_ls:
        score_ls.remove('')
print(score_ls)
score_ls = list(map(float, score_ls))
score_ls.remove(max(score_ls))
score_ls.remove(min(score_ls))
print(score_ls) 
print(f'{max(score_ls):.3f}, {min(score_ls):.3f}, {sum(score_ls) / len(score_ls):.3f}')
 

第6关:将平均成绩附加到列表末尾

任务描述
本关任务:编写一个能将列表数据平均值附加到列表中的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 改变列表元素类型
  2. 向列表末尾附加字符串类型数据

改变列表元素类型

  1. map()函数
    list(map(fun, ls))函数可以将列表ls中的每个元素的类型都转为元素是fun函数确定的类型的列表。
score_ls = [9.8, 9.4, 5.8, 7.9, 10.0, 8.2, 8.6]
print(list(map(str, score_ls)))    
# ['9.8', '9.4', '5.8', '7.9', '10.0', '8.2', '8.6']
  1. 列表推导式
    列表推导式中可以用if表达式过滤掉不符合规则的元素,将符合条件的元素转为某种类型。
score_ls = ['9.8', '', '', '', ' 9.4', '5.8', '7.9', '10', '8.2', '8.6']
print([float(x) for x in score_ls if x != ''])
# [9.8, 9.4, 5.8, 7.9, 10.0, 8.2, 8.6]

向列表末尾附加字符串类型数据
ls.append(x)方法可将元素x附加到列表ls末尾。

  1. 错误用法:
score_ls = ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
print(score_ls)   # 输出原列表
avg_score = sum(map(float, score_ls))/len(score_ls)  # 元素转数值型并计算平均成绩
score_ls.append(round(avg_score, 2))  # 列表末尾增加保留2位小数的平均成绩,无返回值
print(score_ls)             # 输出增加了元素的列表
# ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
# ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6', 8.53]

查看结果,发现附加的元素类型是浮点数,与其他元素类型不同,后续处理可能会有问题。

  1. 正确用法:
    加入时先将平均成绩转为字符串再加入。
avg_score = sum(map(float, score_ls))/len(score_ls)  # 元素转数值型并计算平均成绩
score_ls.append(str(round(avg_score, 2)))  # 列表末尾增加转为字符串的保留2位小数的平均成绩,无返回值
print(score_ls)             # 输出增加了元素的列表
# ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6']
# ['9.8', '9.4', '5.8', '7.9', '10', '8.2', '8.6', '8.53']

10位评委为参加程序设计创意赛的选手打分,评分规则是允许弃权,有效评分在0-10分之间,包含0和10。
每位评委打出分数后,记录员将该分数输入计算机中,所有分数都以字符串类型存放在同一个列表中,弃权时直接输入回车,此时获取的是空字符串。
为了评审更加公平,设置规则:
去除弃权成绩,再去除一个最高分和一个最低分,然后计算平均成绩(保留小数点后3位)并附加到去除了弃权成绩的列表末尾。
输出原始列表和末尾附加了平均成绩、元素为字符串的成绩列表。

编程要求
根据提示,在右侧编辑器补充代码,使程序能依次接收用户输入的10个成绩,将成绩以字符串类型置于列表中输出;去除弃权成绩,再去除一个最高分和一个最低分,然后计算平均成绩(最多保留小数点后2位)并附加到列表末尾。
输出末尾附加了平均成绩、元素为字符串的成绩列表。

测试说明
平台会对你编写的代码进行测试:

测试输入:
(测试程序时请复制公开的测试用例中的输入)

8.9
10
 
 
 
9.8
9.9
8.9
8.2
10

预期输出(数据仅供做为输出格式参考,并非答案):

['8.9', '10', '', '', '', '9.8', '9.9', '8.9', '8.2', '10']
['8.9', '10', '9.8', '9.9', '8.9', '8.2', '10', '9.39']

提示:

  1. 计算时转数值类型,输出时转字符串

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
score=[]
for i in range(10):
    n=input()
    score.append(n)
print(score)
while '' in score:
    score.remove('')
scorefloat=list(map(float,score))
scorefloat.remove(max(scorefloat))
scorefloat.remove(min(scorefloat))
avscore=sum(scorefloat)/len(scorefloat)
score.append(str(round(avscore,2)))
print(score)

第7关:读文件到二维列表

任务描述
本关任务:编写一个能读取csv文件中的数据到二维列表的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 遍历文件对象
  2. 文件中数据转二维列表
  3. 定义文件数据转二维列表的函数

遍历文件对象
with open(file) as fr:可以以读模式打开文件file创建文件对象fr,fr为可遍历对象,每次遍历获取文件的一行。

file = '/data/bigfiles/mark_score.csv'
with open(file) as fr:       # 以读模式创建文件对象
    for line in fr:          # 遍历文件对象
        print(line.strip())  # 去掉行末的换行符
# 7.1,8.6,8.5,7.5,7.3,7.9,7.9,8.5,8.0,7.6
# 9.1,9.6,8.9,9.9,9.4,9.6,8.9,9.5,9.1,8.7
......

文件中数据转二维列表

  1. score = line.strip().split(',')去掉行末的换行符,根据逗号切分为列表,命名为score。
    line.strip().split(‘,’)去掉行末的换行符,根据逗号切分为列表。
    结合遍历文件对象的方法,就可以将文件中的数据转为二维列表。
score_ls = []
line1 = '7.1,8.6,8.5,7.5,7.3,7.9,7.9,8.5,8.0,7.6'
line2 = '9.1,9.6,8.9,9.9,9.4,9.6,8.9,9.5,9.1,8.7'
score = line1.strip().split(',')
score_ls.append(score)
score = line2.strip().split(',')
score_ls.append(score)
print(score_ls)
# [['7.1', '8.6', '8.5', '7.5', '7.3', '7.9', '7.9', '8.5', '8.0', '7.6'], ['9.1', '9.6', '8.9', '9.9', '9.4', '9.6', '8.9', '9.5', '9.1', '8.7']]
  1. 利用列表推导式获得二维列表
file = '/data/bigfiles/mark_score.csv'
with open(file) as fr:  # 创建文件对象
    score_ls = [line.strip().split(',') for line in fr]
print(score_ls)
# [['7.1', '8.6', '8.5', '7.5', '7.3', '7.9', '7.9', '8.5', '8.0', '7.6'], ['9.1', '9.6', '8.9', '9.9', '9.4', '9.6', '8.9', '9.5', '9.1', '8.7'],...]

定义文件数据转二维列表的函数
读文件中的数据到列表的方法使用非常广泛,可以将其定义为一个函数,修改文件名和分隔符就可以用在不同场景下。

def file_to_lst(file):
    """将文件名变量file指向的文件中的用逗号分隔的数据转为二维列表"""
    with open(file) as fr:  # 创建文件对象
        score_ls = [line.strip().split(',') for line in fr]
    return score_ls
if __name__ == '__main__':
    filename = '/data/bigfiles/mark_score.csv'
    print(file_to_lst(filename))

10位评委为参加程序设计创意赛的选手打分,评分规则是允许弃权,弃权的成绩户数空字符串,其他评分在0-10分之间,包含0和10。
文件’mark_score.csv’中保存多位选手的成绩,每行为一位选手的成绩,各成绩之间用半角逗号分隔,编程读取各选手成绩。

mark_score.csv

编程要求
根据提示,在右侧编辑器补充代码,使程序能将文件中的数据转为二维列表,输入一个整数n,以列表形式输出前n位选手的成绩。

测试说明
平台会对你编写的代码进行测试:

测试输入:

3

预期输出:

[['7.1', '8.6', '8.5', '7.5', '7.3', '7.9', '7.9', '8.5', '8.0', '7.6'], ['9.1', '', '', '', '9.4', '', '8.9', '9.5', '9.1', '8.7'], ['7.3', '7.5', '', '', '8.4', '', '', '8.0', '7.7', '7.9']]

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
def file_to_lst(file):
    """将文件名变量file指向的文件中的用逗号分隔的数据转为二维列表"""
    with open(file) as fr:  # 创建文件对象
        score_lst = [line.strip().split(',') for line in fr]
    return score_lst

if __name__ == '__main__':
    filename = '/data/bigfiles/mark_score.csv'
    score_lst = file_to_lst(filename)
    n = int(input())
    result = score_lst[:n]
    print(result)

第8关:二维列表数据分析

任务描述
本关任务:编写一个能分析二维列表中数据的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 删除二维列表中空字符串元素
  2. 计算平均成绩附加到每个子列表末尾

删除二维列表中空字符串元素
参考第5关,两层循环,外层遍历二维列表,每次获取一个子列表;内层循环判定是否还存在空字符串,删除空字符串。

score_ls = [['6.4', '6.1', '6.5', '', '7.1', '6.4', '6.3', '5.6', '6.6', '7.0'], ['8.1', '8.2', '7.7', '7.5', '7.5', '7.6', '8.2', '', '8.1', '7.6']]
for lst in score_ls:  # 遍历二维列表,lst为子列表
    while '' in lst:  # 循环判定子列表中是否还有空字符串
        lst.remove('')  # 移除子列表中的空字符串
    lst = list(map(float, lst))  # 当前子列表转浮点数
    print(lst)
# [6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0]
# [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6]

计算平均成绩附加到每个子列表末尾

  1. 参考第6关,需要注意的是,若不创建新列表,修改原来二维列表的话,在遍历时,要遍历列表的长度,以获取每个子列表的序号,这样,可以直接修改子列表。
score_ls = [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6]]
for i in range(len(score_ls)):               # 遍历二维列表的长度,i为子列表的序号
    avg = sum(score_ls[i])/len(score_ls[i])  # 计算当前序号子列表元素的平均值
    score_ls[i].append(round(avg, 2))        # 修改当前序号的子列表,附加一个元素到列表末尾
print(score_ls)
# [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0, 6.44], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6, 7.83]]
  1. 创建一个新的二维列表容纳附加了平均成绩的数据
score_ls = [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6]]
score_new = []
for lst in score_ls:               # 遍历二维列表的长度,i为子列表的序号
    avg = sum(lst)/len(lst)  # 计算当前序号子列表元素的平均值
    lst.append(round(avg, 2))        # 修改当前序号的子列表,附加一个元素到列表末尾
    score_new.append(lst)
print(score_new)
# [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0, 6.44], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6, 7.83]]

10位评委为参加程序设计创意赛的选手打分,评分规则是允许弃权,弃权的成绩户数空字符串,其他评分在0-10分之间,包含0和10。
文件’mark_score.csv’中保存多位选手的成绩,每行为一位选手的成绩,各成绩之间用半角逗号分隔,编程读取各选手成绩。

编程要求
根据提示,在右侧编辑器补充代码,使程序能将文件中的数据转为子列表元素是浮点数的二维列表,先去掉弃权评委的成绩(空字符串),再去掉每位选手的一个最高分和一个最低分,计算每位选手的平均分并附加到子列表末尾(平均分保留小数点后2位)。输入一个整数n,以列表形式输出前n位选手的成绩。

测试说明
平台会对你编写的代码进行测试:

测试输入:

4

预期输出:

[[8.5, 7.5, 7.3, 7.9, 7.9, 8.5, 8.0, 7.6, 7.9], [9.1, 9.4, 8.9, 9.1, 9.12], [7.5, 8.0, 7.7, 7.9, 7.78], [7.2, 7.1, 6.8, 7.1, 6.2, 6.4, 6.9, 6.81]]

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
def file_to_lst(file, n):
    """将文件名变量file指向的文件中的用逗号分隔的数据转为二维列表"""
    list1 = []
    with open(file) as fr:  # 创建文件对象
        for i in range(n):
            score_ls = fr.readline().strip()
            score_ls = score_ls.split(',')
            list1.append(score_ls)
        return list1    
 
if __name__ == '__main__':
    filename = '/data/bigfiles/mark_score.csv'
    n = int(input())
    list2=[]
    for lst in file_to_lst(filename, n):  # 遍历二维列表,lst为子列表
        while '' in lst:  # 循环判定子列表中是否还有空字符串
            lst.remove('')  # 移除子列表中的空字符串
        lst = list(map(float, lst))  # 当前子列表转浮点数
        lst.remove(max(lst))
        lst.remove(min(lst))
        avg_score = sum(map(float, lst))/len(lst) 
        lst.append(float(round(avg_score, 2)))
        list2.append(lst)
    print(list2)

第9关:成绩排序

任务描述
本关任务:编写一个能分析二维列表中数据的小程序。

相关知识
为了完成本关任务,你需要掌握:

  1. 二维列表排序
  2. 多关键字排序

二维列表排序

ls.sort(*, key=None, reverse=False)
sorted(ls, key=None, reverse=False)

排序方法参考第4关讲解。
二维列表排序一般用参数key=lamdba x: x[n]指定根据 子列表x序号为n的数据项进行排序。

# 根据二维列表最后一个元素(序号-1)降序排序输出
score_ls = [[8.5, 7.5, 7.3, 7.9, 7.9, 8.5, 8.0, 7.6, 7.9], [9.1, 9.4, 8.9, 9.1, 9.12], [7.5, 8.0, 7.7, 7.9, 7.78], [7.2, 7.1, 6.8, 7.1, 6.2, 6.4, 6.9, 6.81], [8.1, 8.1, 7.9, 7.9, 7.5, 7.2, 7.8, 8.0, 7.81]]
print(sorted(score_ls, key=lambda x: x[-1],reverse=True))
# [[9.1, 9.4, 8.9, 9.1, 9.12], 
# [8.5, 7.5, 7.3, 7.9, 7.9, 8.5, 8.0, 7.6, 7.9], 
# [8.1, 8.1, 7.9, 7.9, 7.5, 7.2, 7.8, 8.0, 7.81], 
# [7.5, 8.0, 7.7, 7.9, 7.78], 
# [7.2, 7.1, 6.8, 7.1, 6.2, 6.4, 6.9, 6.81]]

多关键字排序
二维列表多关键字排序一般用参数key=lamdba x: (x[n],x[m],...)指定,依次优先根据元组(x[n],x[m],...)中的项进行排序,主关键字x[n]值相同时,再根据次关键字 x[m]值排序,依此类推。
当要求两个排序关键字一个升序一个降序时,可以将其中一个关键字设为负值。

score_ls = [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6]]
for i in range(len(score_ls)):               # 遍历二维列表的长度,i为子列表的序号
    avg = sum(score_ls[i])/len(score_ls[i])  # 计算当前序号子列表元素的平均值
    score_ls[i].append(round(avg, 2))        # 修改当前序号的子列表,附加一个元素到列表末尾
print(score_ls)
# [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0, 6.44], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6, 7.83]]
  1. 创建一个新的二维列表容纳附加了平均成绩的数据
score_ls = [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6]]
score_new = []
for lst in score_ls:               # 遍历二维列表的长度,i为子列表的序号
    avg = sum(lst)/len(lst)  # 计算当前序号子列表元素的平均值
    lst.append(round(avg, 2))        # 修改当前序号的子列表,附加一个元素到列表末尾
    score_new.append(lst)
print(score_new)
# [[6.4, 6.1, 6.5, 7.1, 6.4, 6.3, 5.6, 6.6, 7.0, 6.44], [8.1, 8.2, 7.7, 7.5, 7.5, 7.6, 8.2, 8.1, 7.6, 7.83]]

10位评委为参加程序设计创意赛的选手打分,评分规则是允许弃权,弃权的成绩户数空字符串,其他评分在0-10分之间,包含0和10。评委中最后一人为仲裁,此人不允许弃权(成绩非空)。
文件’mark_score.csv’中保存多位选手的成绩,每行为一位选手的成绩,各成绩之间用半角逗号分隔,编程读取各选手成绩。

编程要求
根据提示,在右侧编辑器补充代码,使程序能将文件中的数据转为子列表元素是浮点数的二维列表,去掉每位选手的一个最高分和一个最低分,计算每位选手的平均分并附加到子列表末尾(平均分保留小数点后2位)。
将二维列表根据平均成绩降序排序,当平均成绩相同时,根据仲裁成绩升序排序
输入一个整数n,以列表形式输出排序后前n位选手的成绩。

测试说明
平台会对你编写的代码进行测试:

测试输入:

10

预期输出:

[[8.8, 9.7, 8.9, 9.8, 9.5, 9.7, 8.9, 9.5, 9.35],
 [8.6, 9.7, 9.2, 9.6, 9.2, 9.7, 9.5, 8.8, 9.29],
 [9.0, 9.4, 9.6, 9.6, 9.0, 9.6, 9.1, 8.9, 9.28],
 [9.0, 9.0, 9.2, 8.8, 9.6, 9.3, 9.1, 9.9, 9.24],
 [9.8, 9.8, 8.6, 9.6, 9.1, 8.6, 9.6, 8.7, 9.23],
 [9.6, 9.4, 8.8, 9.4, 8.5, 9.1, 9.8, 8.7, 9.16],
 [9.1, 9.4, 8.9, 9.1, 9.12],
 [9.3, 9.4, 9.6, 9.6, 8.4, 9.4, 8.8, 8.2, 9.09],
 [8.8, 9.2, 9.4, 8.6, 9.5, 9.3, 9.0, 8.7, 9.06],
 [9.1, 9.5, 8.4, 9.3, 8.7, 9.5, 9.1, 8.9, 9.06]]

开始你的任务吧,祝你成功!

参考代码

# 禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/137976362
# 参考教程:B站视频讲解 https://space.bilibili.com/3546616042621301
def file_to_lst(file):
    with open(file) as fr:
        score_ls = [line.strip().split(',') for line in fr]
    return score_ls
 
def del_null_string(score_ls):
    score_ls_float = []
    for lst in score_ls:
        while '' in lst:
            lst.remove('')
        lst = list(map(float,lst))
        score_ls_float.append(lst)
    return score_ls_float
 
def add_avg(score_ls_float):
    for i in range(len(score_ls_float)):
        score_ls_float[i].remove(max(score_ls_float[i]))
        score_ls_float[i].remove(min(score_ls_float[i]))
        avg = sum(score_ls_float[i]) / len(score_ls_float[i])
        score_ls_float[i].append(round(avg,2))
    return score_ls_float
 
if __name__ == '__main__':
    filename = '/data/bigfiles/mark_score.csv'
    n = int(input())
    score_lst = file_to_lst(filename)
    score_lst_f = del_null_string(score_lst)
    score_avg = add_avg(score_lst_f)
    print(sorted(score_avg, key=lambda x: (x[-1],-x[-2]),reverse=True)[:n])

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谛凌

本人水平有限,感谢您支持与指正

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值