Python第三次上机实习


1、 已知“score”文件夹下 score.txt 中保存有 10 个评委对 3 个候选人的打分情况,示例如 下 Judge1,75,85,81 Judge2,84,87,76 ……
从左到右各个字段的含义分别为:评委号,1 号候选人得分,2 号候选人得分,3 号候选 人得分,各字段之间用逗号分隔。 要求设计 Python 程序,(1)读取该 txt 文件,将每个候选人的得分去掉一个最高分和一 个最低分,(2)计算剩余得分的平均数作为该候选人最终成绩,(3)找出最终成绩最高 的候选人的编号及最终成绩,分别输出到 socre 文件夹下 score.xlsx 文件的 score 工作簿 中A1 和 B1 单元格,如下图所示。image-20200624182711260

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import openpyxl
from openpyxl import Workbook

# 创建三个空列表来存储每个候选人的分数s
player1 = []
player2 = []
player3 = []
play = [player1, player2, player3]
j = 1
# 创建一个字典存储每个人的最终得分
result = {}
with open("score.txt", 'r') as fp:
    # 先打开文本将所有的分数存入每个人的列表
    for i in range(10):
        scores = fp.readline().strip().split(',')
        player1.append(int(scores[1]))
        player2.append(int(scores[2]))
        player3.append(int(scores[3]))

# 去掉每个人的最高分并计算平均分
for i in play:
    maxScore = max(i)
    i.remove(maxScore)
    minScore = min(i)
    i.remove(minScore)
    averageScore = sum(i)/len(i)
    # 将每个候选人的序号及其对应分数放入字典
    player = 'player' +str(j)
    j += 1
    result[player] = averageScore

# 获取得分最高的候选人及其分数
winner = max(result, key=result.get)
winnerScore = result[max(result, key=result.get)]

# 将成绩最高的候选人的编号及其最终成绩输出到score文件夹
fn = 'score.xlsx'
wb = Workbook()
ws = wb.create_sheet(title='score')
ws['A1'] = winner
ws['B1'] = winnerScore
wb.save(fn)

2、 sensor 文件夹下存在两个 Python 源文件,分别对应两个问题。请按照文件内说明修改 代码,实现以下功能: 下面所示为一套由公司职员随身佩戴的位置传感器采集的数据,文件名称为 “sensor.txt”,其内容示例如下 2016/5/31 0:05, vawelon001,1,1 2016/5/31 0:20, arpa001,1,1 2016/5/31 2:26, arpa001,1,6 … (略) 第一列是传感器获取数据的时间,第二列是传感器的编号,第三列是传感器所在的楼层, 第四列是传感器所在的位置区域编号,各字段之间用逗号分隔。
问题 1:在 PY301_1.py 文件中修改代码,读入 sensor.txt 文件中的数据,提取出传感器 编号为 arpa001 的所有数据,将结果输出保存到“arpa001.txt”文件。 输出文件格式要求:原数据文件中的每行记录写入新文件中,行尾无空格,无空行。参考 格式如下:
2016/5/31 7:11, arpa001,2,4 2016/5/31 8:02, arpa001,3,4 2016/5/31 9:22, arpa001,3,4 …(略)

# 以下代码为提示框架
# 请在...处使用一行或多行代码替换
# 请在______处使用一行代码替换

# 打开sensor.txt来读取数据
# 创建earpa001.txt来写入数据
with open('sensor.txt', encoding="utf-8")as fn:
    with open('earpa001.txt', 'w')as fo:
        for line in fn:
            # 一行的内容写入一个列表,每个元素对应每一列的内容
            lst = line.strip(" \n").split(",")
            # 验证第二个元素是不是earpa001,若是,则将该行写入文本
            if lst[1] == " earpa001":
                fo.write('{},{},{},{}\n'.format(lst[0], lst[1], lst[2], lst[3]))

(选做)问题 2:在 PY301_2.py 文件中修改代码,读入“arpa001.txt”文件中的数据, 统计 arpa001 对应的职员在各楼层和区域出现的次数,保存到“earpa001_count.txt” 文件,每条记录一行,位置信息和出现的次数之间用英文半角逗号隔开,行尾无空格,无 空行。
参考格式如下 1-1,5 1-4,3 …(略) 含义如下:第 1 行“1-1,5”中 1-1 表示 1 楼 1 号区域,5 表示出现 5 次;第 2 行“14,3”中 1-4 表示 1 楼 4 号区域,3 表示出现 3 次。

# 以下代码为提示框架
# 请在...处使用一行或多行代码替换
# 请在______处使用一行代码替换


# 打开sensor.txt来读取数据
# 创建earpa001.txt来写入数据
with open('earpa001.txt', encoding="utf-8")as fn:
    with open('earpa001_count.txt', 'w')as fo:
        # 创建一个空字典用来存储哪个区域出现了几次
        d = {}
        for line in fn:
            # 一行的内容写入一个列表,每个元素对应每一列的内容
            ls = line.strip(" \n").split(",")
            # 用site(键)表示几楼几号区域
            site= ls[2] + "-" + ls[3]
            # 值为出现的次数
            d[site] = d.get(site, 0) + 1
        ls = list(d.items())
        ls.sort(key=lambda x: x[1], reverse=True)  # ¸ÃÓï¾äÓÃÓÚÅÅÐò
        # 将相关内容写入文件
        for i in range(len(ls)):
            fo.write('{},{}\n'.format(ls[i][0], ls[i][1]))

文章作者: 陈细利
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陈细利 !
评论
 上一篇
Python编程从入门到实践答案9 Python编程从入门到实践答案9
这本书是我自学Python的第一本书,里面的习题都在寒假已经完成,由于当时博客尚未搭建,故里面题目的答案并未发表。现在在开发项目博客没有新内容更新,因此这段实践会陆续上传原来的习题答案。每个题目均为自己设计的代码,优化与重构方面与标准答案可
下一篇 
Python基础语法4 Python基础语法4
参考教材:Python程序设计基础与应用(机械工业出版社/董付国) ​ 由于时间紧迫,故只整理语法,没有写实例,在学习或复习过程中每个语法点都应搭配合适的例子进行练习。 第七章1.常用转义字符 转义字符 含义 \b 退格,
  目录