您的位置:首页 > 编程语言 > Python开发

Python表数据统计处理程序一枚

2015-12-25 21:15 681 查看
临近年终,部门要做年度互评(项目组之间都不怎么了解,互评什么的有意义→_→)。发了一张打印好了表格的A4纸,然后要大家用A/B/C/D对各项指标进行匿名评分,事后再来人工统计。作为程序员遇见这种事情必须醉啊,简直太有羞耻感了。这种事情不写个程序来搞一下简直辱没祖师爷。

于是边干苦力边想,用C++这个东西要怎么做?

当然是瞬间就冒出几个类的大体雏形,然后各种map、list操作流程就在大脑中自动构建…大概想清楚了之后才惊觉用C++做这种事情简直有一种拿着屠龙刀割细肉的感觉-滑稽啊。果断换到Python。So,OOP这种东西显然可以收起来了,函数式编程用起来。先预处理一下表格数据,再用map折叠一下,ok,duang,搞定。

"""
年度个人评分表处理程序说明
data.txt文件格式依赖:
文件需排版为表格格式,且用空格隔开,第一项为姓名,后续为各项指标的得分,示例如下
姓名      技能1st     技能2nd     技能3rd     技能4th
gaoshan     a           b           c            d
hongxue     a           a           a            b
gaoshan     a           b           c            d
hongxue     a           a           a            b
gaoshan     c           b           c            d
hongxue     d           a           c            b
gaoshan     b           a           a            d
hongxue     d           d           a            b

文件输出结果为各项指标的得分统计
hongxue
技能1st {'a': 2, 'd': 2}
技能2nd {'a': 3, 'd': 1}
技能3rd {'c': 1, 'a': 3}
技能4th {'b': 4}
gaoshan
技能1st {'c': 1, 'b': 1, 'a': 2}
技能2nd {'b': 3, 'a': 1}
技能3rd {'c': 3, 'a': 1}
技能4th {'d': 4}

Author: gy 2015.12.18
"""
# 年度个人评分表处理程序
import itertools

def help_func(row_name,*args):
tmp_dict = dict()
for key in args:
tmp_dict[key] = tmp_dict.get(key, 0) + 1
print("\t",row_name,tmp_dict)

with open("d:/data.txt", encoding="utf-8") as fp:
data_dict = dict()
table_head = fp.readline().split()
for line in fp:
raw_data = line.split()
namex = raw_data[0]
name_datas = data_dict.get(namex, [])
name_datas.insert(0,raw_data[1:])
data_dict[namex] = name_datas
for namex,item in data_dict.items():
print(namex)
for _ in map(help_func, table_head[1:],*item):pass


Python程序比较简单啦。
1.提取表头;
2.用dict将每个人的数据集中到一起去;
3.统计结果,并打印出来.


Coding过程还是踩了几个坑,记录如下:

# 001  dict.get(key, []).insert(0, value)错误
d = dict()
listx = [1, 2, 3]
d['a'] = d.get('a', []).insert(0, listx)
print(d)
# 输出结果为  {'a': None}
# 原因是list的insert方法的返回值为None而不是更新后的list
# 因之,list是不能进行连续插入操作的,如
# d.get('a', []).insert(0, listx).insert(0, listx),会报错
# AttributeError: 'NoneType' object has no attribute 'insert'

# 002 python 3.x map()函数被设计为lazy function,返回值为一个迭代器对象,用法上需要注意
# print(map())的结果为map()的内存对象索引<map object at 0x0000000003B50C18>,并没有直接
# 可用的值,使用值需要这样
for item in map(None, *items):
pass


最后,程序要求输入已近是整理好的表格,所以针对我司仍然采用纸质表格采集数据这种情怀爆表的方式来说仍然鸡肋。鸡肋,鸡肋,食之无味弃之可惜。想想写个采集数据的web原形也就一两天的事情,扩展一下应该也能给公司省点人力,物力吧,毕竟大家今年很早就在喊着寒冬了。然而,“寂寞新文苑,平安旧战场,两间余一卒,何戟独彷徨”,这是迅哥儿的诗么?我还是再写一个Note好了。

Notes:

# 01.得出Python的确比C++省下了几十行代码,也节约了我大半天时间这种结论是不必亲身coding一个C++程序出来的——当然,C++大神们不在此列。

# 02.使用Python和C++最大的不同之处在于你思考问题的方式不一样了。语言是有差异的,有优劣的,选择也是需要谨慎的,毕竟这也很像谈恋爱。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: