如何按升序对字典的多个值进行排序?

时间:2016-08-09 04:33:35

标签: python-2.7

我必须按升序对字典值进行排序。然后我必须从字典中排除零元素。我发现了很多按键或值排序字典的例子而不是值本身。对此有何帮助?

输入:

1467606570.0,192.168.123.241,0.0
1467606817.0,192.168.123.241,247.0
1467607136.0,192.168.123.241,319.0
1467607244.0,192.168.123.241,108.0
1467607642.0,192.168.123.241,398.0
1467608334.0,192.168.123.241,692.0
1467606628.0,192.168.123.240,0.0
1467606876.0,192.168.123.240,248.0
1467607385.0,192.168.123.240,509.0
1467606679.0,192.168.123.246,0.0
1467607084.0,192.168.123.246,405.0
1467607713.0,192.168.123.246,629.0
1467608102.0,192.168.123.246,389.0
1467607524.0,192.168.123.242,0.0
1467608257.0,192.168.123.242,733.0
1467608607.0,192.168.123.242,350.0
1467608669.0,192.168.123.245,0.0
1467608813.0,192.168.123.245,144.0

代码:

    mydict = {}
    #sorted_dict = {}
    reader = csv.reader(open("/tmp/log/qpm.csv", "rb"))
    for i, rows in enumerate(reader):
       if i == 0: continue
       k = rows[1]
       v = rows[2]

       if not k in mydict:
       mydict[k] = [v]
       else:
       mydict[k].append(v)

    #for key, value in mydict.iteritems():
    for key, value in sorted (mydict.iteritems(), key=operator.itemgetter(1),reverse=True):
        print key, value

输出:

192.168.123.241 ['247.0', '319.0', '108.0', '398.0', '692.0']
192.168.123.242 ['0.0', '733.0', '350.0']
192.168.123.246 ['0.0', '405.0', '629.0', '389.0']
192.168.123.240 ['0.0', '248.0', '509.0']
192.168.123.245 ['0.0', '144.0']

必需输出:

192.168.123.241 ['108.0', '319.0', '398.0', '692.0']
192.168.123.242 ['0.0', '350.0', '733.0']
192.168.123.246 ['0.0', '389.0', '405.0', '629.0']
192.168.123.240 ['0.0', '248.0', '509.0']
192.168.123.245 ['0.0', '144.0']

如何按升序排序值?

1 个答案:

答案 0 :(得分:0)

根据示例输出,我怀疑您想要为每个键排序吗?如果是这样,您可以通过将print语句更改为:

来完成此操作
print key, sorted(value)

请注意,values列表中的条目是字符串,因此将按字典顺序排序,我怀疑这不是您想要的。要排序为浮点数,您可以指定自定义比较器:

print key, sorted(value, key=lambda x: float(x))

或者,您可以在最初读取数据时将值存储为浮点数:

 if not k in mydict:
     mydict[k] = [float(v)]
 else:
     mydict[k].append(float(v))
相关问题