7.3 投票文件数据统计

这是一个经典练习,主要涉及对字典和文件处理的综合技能。

主要目的是实现投票文件数据统计,比如有数据文件 count.txt,内容为每个候选人及其选票,可能一个候选人会出现多次:

张三    6
李四    8
王二    3
张三    5
王二    4
张三    3

要求读取文件,并统计汇总结果为: {'张三': 14, '李四': 8, '王二': 7}

1)建立数据文件

可以在PyCharm中直接建立数据文件,右击当前项目,选择New——File,如:

然后即可输入新的文件名称(扩展名也要全部输入):

 

接着就可以输入上述数据内容,保存后即可完成数据文件的准备。

 

 2)测试读取文件

with open('count.txt') as f:
    for line in f.readlines():
        print(line)

可能的运行界面为:

 如果出现这种问题,可能的原因在于字符集没有正确设置,可以使用encoding来选择设置:

with open('count.txt', encoding='UTF-8') as f:
    for line in f.readlines():
        print(line)

运行界面为:

很多同学可能是在其他地方建立的数据文件,比如记事本:

 

此时要注意保存的文件,需要根据情况选择下不同的字符集,比如 UTF-8 等(需要结合自己的电脑来观察,不同的电脑可能不一样):

 

 3)处理数据

将读取过来的数据,进行必要的解析,得到候选人姓名和选票:

with open('count.txt') as f:
    for line in f.readlines():
        words = line.split()
        print(words)

输出为:
['张三', '6']
['李四', '8']
['王二', '3']
['张三', '5']
['王二', '4']
['张三', '3']

也可以:

with open('count.txt') as f:
    for line in f.readlines():
        words = line.split()
        print(words[0], words[1])

输出为:
张三 6
李四 8
王二 3
张三 5
王二 4
张三 3

具体格式可以根据你的处理方法来选择。

4)统计数据

统计方法很直观,遍历读取的每个候选人和选票,然后判断候选人是否在字典中,如不在就新建一个并设置初始值为当前读取的选票数。如在,就把新的选票数累计到原有的值上:

with open('count.txt') as f:
    dict = {}
    for line in f.readlines():
        words = line.split()
        if words[0] not in dict:
            dict[words[0]] = int(words[1])
        else:
            dict[words[0]] = dict[words[0]] + int(words[1])
print(dict)

输出为:{'张三': 14, '李四': 8, '王二': 7}

也可以使用 get 函数来实现同样的功能:

with open('count.txt') as f:
    dict = {}
    for line in f.readlines():
        words = line.split()
        dict[words[0]] = dict.get(words[0], 0) + int(words[1])
print(dict)

输出内容同上。此时无需判断是否存在,因为 get 函数如果有第二个参数(比如这里的 0 ),就会在找不到元素时直接返回第二个参数的值。因此第一次新建一个候选人元素时,对应的 get 函数返回 0 ,加上后面的初始得票数,正好就是第一条候选人的得票数。后续添加相同候选人时,该 get 函数将会返回原有的得票数,正好加上新的得票数,累加成汇总值。

也可以使用 update 函数来实现同样的功能:

with open('count.txt') as f:
    dict = {}
    for line in f.readlines():
        words = line.split()
        dict.update({words[0]: dict.get(words[0], 0) + int(words[1])})
print(dict)

输出内容同上。功能也和上面的 get 函数效果一样。


进一步完善练习,读取文件,并统计平均结果为:

{'张三': 4.67, '李四': 8.0, '王二': 3.5}。

所谓平均结果是指该候选人得票数除以投票人的个数。为此,不仅需要保存投票数总和,还需要统计投票人的个数:

with open('count.txt') as f:
    dict = {}
    for line in f.readlines():
        words = line.split()
        if words[0] not in dict:
            dict[words[0]] = [int(words[1]), 1]
        else:
            dict[words[0]][0] = dict[words[0]][0] + int(words[1])
            dict[words[0]][1] += 1
print(dict)

输出为:{'张三': [14, 3], '李四': [8, 1], '王二': [7, 2]}

这里对于每个字典元素,它的值是一个具有两个值的列表,分别存储着与元素键对应的候选人得票数总和和投票人个数。所以最终可以获得每个候选人的得票总和和投票人个数。

有了这些基础,进一步增加计算平均值的过程:

with open('count.txt') as f:
    dict = {}
    for line in f.readlines():
        words = line.split()
        if words[0] not in dict:
            dict[words[0]] = [int(words[1]), 1]
        else:
            dict[words[0]][0] = dict[words[0]][0] + int(words[1])
            dict[words[0]][1] += 1
dict2 = {}
for i in dict:
    dict2[i] = round(dict[i][0] / dict[i][1], 2)
print(dict2)

输出为:
{'张三': 4.67, '李四': 8.0, '王二': 3.5}

请大家上机观察并调试。

配套学习资源、慕课视频:

Python大数据分析-李树青icon-default.png?t=M1L8https://www.njcie.com/python/

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

leeshuqing

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值