这是一个经典练习,主要涉及对字典和文件处理的综合技能。
主要目的是实现投票文件数据统计,比如有数据文件 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}
请大家上机观察并调试。
配套学习资源、慕课视频: