一、项目背景
1、项目需求
需要对python内的list< Dictionary >格式数据进行统计
2、实施时间
2020-12-17
二、 技术背景
1、阅读文章所需知识背景
1)具有少量python相关经验,了解数组、字典 、for循环语句用法
2、开发环境
1)Win10-64
2)Python 3.6.6
3、开发工具
1)Pycharm 2020.2.2
三、思考分析过程
1、确认数据格式
数据取自postgres数据库,取出后已处理成 list< Dictionary >格式。list中的每个Dictionary代表数据库中的一行数据,Dictionary中的key对应数据库表中的字段名,value对应该字段的具体数据。(下述数据已做模糊处理,以避免数据泄露风险。)
[
{'q_id': '953', 's_name': '程大花', 's_id': '10774', 'an_id': '001'},
{'q_id': '953', 's_name': '程二花', 's_id': '10774', 'an_id': '002'},
{'q_id': '954', 's_name': '程三花', 's_id': '10774', 'an_id': '001'},
{'q_id': '954', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '001'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
]
2、数据统计
为配合前端展示,需要python后端提供去重后的q_id数量。pandas等数据统计类库中应该有类似postgres count(distinct)的数据统计方式,可惜我个人并没有调研过pandas模块用法。
个人猜想count(distinct)方法应该是依次轮询每一条数据,遇到与之前不同的数据则计数+1,轮询完所有数据之后返回计数值。
依照上述思路,第一步我们使用for循环将q_id从list< dictionary >中取出
dataList = [
{'q_id': '953', 's_name': '程大花', 's_id': '10774', 'an_id': '001'},
{'q_id': '953', 's_name': '程二花', 's_id': '10774', 'an_id': '002'},
{'q_id': '954', 's_name': '程三花', 's_id': '10774', 'an_id': '001'},
{'q_id': '954', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '001'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
]
for i in dataList:
print(i["q_id"])
第二步我们需要判断q_id是否重复。这里我考虑了一下,有两个方案。
一个是创建一个空list,每次取出后使用python in判断,如果当前的q_id不在list中,那么则将当前的q_id存入list中,通过上述方式来去重。
dataList = [
{'q_id': '953', 's_name': '程大花', 's_id': '10774', 'an_id': '001'},
{'q_id': '953', 's_name': '程二花', 's_id': '10774', 'an_id': '002'},
{'q_id': '954', 's_name': '程三花', 's_id': '10774', 'an_id': '001'},
{'q_id': '954', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '001'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
]
resultList = []
for i in dataList:
if i["q_id"] not in resultList:
resultList.append(i["q_id"])
print(resultList)
另一个同样需要先创建空list,每次取出后直接存入list,再利用set可创建不重复元素集的特性,来实现去重。
dataList = [
{'q_id': '953', 's_name': '程大花', 's_id': '10774', 'an_id': '001'},
{'q_id': '953', 's_name': '程二花', 's_id': '10774', 'an_id': '002'},
{'q_id': '954', 's_name': '程三花', 's_id': '10774', 'an_id': '001'},
{'q_id': '954', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '001'},
{'q_id': '955', 's_name': '程四花', 's_id': '10774', 'an_id': '002'},
]
resultList = []
for i in dataList:
resultList.append(i["q_id"])
print(list(set(resultList)))
这里要注意,set创建的是无序不重复数据集,若对去重后数据顺序有要求,那么这里是不推荐的。本次需求只需要统计数据量,因此使用set也没有影响。
最后我们只需要使用len()方法获取resultList长度即可得去重后q_id的数据量。
print(len(resultList))
总结
整个代码并不复杂,然而思考最是难能可贵。习惯使用他人封装的方法,未能深入思考其原理与实现方式,记此以自勉,切不可人云亦云放弃思考。
希望本文可以帮助到有需要的人。阅读本文的过程中如有任何问题欢迎随时与我联系。