搜尋

首頁  >  問答  >  主體

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指令也無法滿足需要啊

黄舟黄舟2720 天前950

全部回覆(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
  • 取消回覆