您的位置:首页技术文章
文章详情页

python - 如何利用元组中某个数据或字典中某组key,对一个序列的数据进行排序?

浏览:94日期:2022-06-29 15:57:33

问题描述

假设通过对海量的原始数据后分析得到这样的数据:

[(id,node,val)(id,node,val)...]就是依次为 用户id,所在服务器,数值 这样的元组,然后要根据服务器分开,再依靠val大小进行排序,然后写入excel中。或者产生[{'id':xxx,'node':xxx,'val':xxx},{'id':xxx,'node':xxx,'val':xxx}...]如果是只有一组kv,可以通过sorted的方式进行排序,但是现在node的名称是未知的,这些服务器名每天都可以能会发生变化。当我获取到这样的数据后,如何根据服务器名称分开,再排序数据呢?这里主要卡在,node本身的名称并不是固定的,比如你先创建n个列表,把相同节点的数据放进去,但你不知道要创建多少个列表。而且之后在将处理后的数据写入excel时,势必要用到循环。这样循环套循环,而且无论是数据分类后,还是排布后的新数据组名称都不是确定的。即便使用exec命令也无法满足需要啊

问题解答

回答1:

from collections import defaultdictd = defaultdict(list)data = [(id,node,val),(id,node,val)...]# 按node进行分组for x in data: d[x[1]].append(x) # 将分组数据依次写入excelfor _, v in d.iteritems(): # 排序 tmp = sorted(v, key=lambda x: x['val'], reverse=True/False) # 写入excel write_to_excel(tmp)

另外其实可以将数据按id, node, val 全部写入csv文件通过linux的awk, uniq, sort 等命令工具写一个shell脚本, 也是很快的

还有关于你的海量数据究竟有多大, 在哪个数量级,没有明确, 如果数据量真的很大, 用上面的python代码内存不够用也是可能的, 这个需要你自己估算下

回答2:

如果我正确理解了你的需求的话,可以用字典,字典的键是node的名称,字典的值是由项组成的列表:

data = [{'id':xxx,'node':xxx,'val':xxx},{'id':xxx,'node':xxx,'val':xxx}...]result = {}for data_item in data: node_name = data_item['node'] if node_name in result.keys():result[node_name].append(data_item) else:result[node_name] = [data_item]

之后再根据键(服务器名称)取出字典中的每一项的值(就是数据列表),对其sort加lambda根据每一项中的某个值进行排序。

标签: Python 编程