快到年终了,今年年初单位制定了一个绩效考核标准(不知道哪位大神给老大献的“谗言”),标准是每月都加班且加班次数最多的前十名将年终奖励比例提高5%(神标准)。为了这5%的年终奖,大家也是拼了,连一向不加班的大老王,今年也成了常客,每天下班后泡一杯茶,办公桌前一坐,就开始“加班”了……
这种无效加班是不是该杜绝考核标准咱今天就不讨论了,这样的考核到底有没有效果也就不说了。悲催的是今天老大布置了一个任务:让从12个月的考勤表中导出来的加班信息统计一下,看下到底这5%的奖励应该发给谁(毕竟狼多肉少啊),要知道,单位是个几百号人的大单位,一个一个数么?这样,我就又得加班到很晚了,但是老板的命令也不能违抗不是?
老板发话了就做呗好在本人是个Pythoner,对这样的问题也是见怪不怪了,别说几百号人的数据,比这大几十倍几百倍的数据本人也是处理过的(提高下信心,允许我吹嘘一下)……
不信,你看……
这是个什么样的问题
我们先看下从考勤系统中导出来的数据长什么样子?如下图所示。
考勤表中导出的数据考虑问题不需要太复杂,我们将问题进一步简化为:从单位的个人中找到1-12月份中每月都加班,并且加班次数最多的前10个人。这样看来就简单多了……
程序思维
第一步,获取Excel中的数据,将每个月的数据存储为12个字典;
第二步,找到12个字典中的公共键(即每月都加班的人的ID);
第三步,统计公共键中每一项的加班合计次数。
分步解决问题
第一步:获取Excel中的数据。
关于Excel处理的基础知识,可以参考本人前面的博文(或者百度搜索:‘Python利用openpyxl处理Excel文件’也能找到小编写的一些入门知识点)。具体不赘述了,直接上代码。
这一步完成后,我们的数据就整齐了,我们将每个月个人的加班次数以‘个人ID’:‘加班次数’这样的结构保存在了字典列表中。
第二步:找到12个字典的公共键。
从字典中找公共键的问题,网上有很多思路,大家可以参考一下,主要有三种方式:
1.使用for循环遍历字典;
2.使用set集合操作;
3.使用reduce()和map()函数。
这里就不再赘述了,感兴趣的朋友们可以自己搜索看一下。我们今天使用reduce()、map()函数来解决这个问题,至于为什么使用内置函数,因为它快(参见不要总抱怨它慢了突破性能瓶颈找到Python序列筛选数据的最优解)。我们同样定义一个函数get_