首页  >  问答  >  正文

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

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

[(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命令也无法满足需要啊

黄舟黄舟2686 天前911

全部回复(2)我来回复

  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-12 09:24:19

    from collections import defaultdict
    
    d = defaultdict(list)
    data = [(id,node,val),(id,node,val)...]
    
    # 按node进行分组
    for x in data:
        d[x[1]].append(x)
        
    # 将分组数据依次写入excel
    for _, 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代码内存不够用也是可能的, 这个需要你自己估算下

    回复
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-12 09:24:19

    如果我正确理解了你的需求的话,可以用字典,字典的键是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根据每一项中的某个值进行排序。

    回复
    0
  • 取消回复