在python中使用元组作为键对数组字典进行排序

时间:2014-08-07 14:03:50

标签: python sorting dictionary

我是一个字典,其中字符串元组为键,数组为值:

some_dict = {}
some_dict[(A,A)] = [1234, 123]
some_dict[(A,B)] = [1235, 13]
some_dict[(A,C)] = [12, 12]
some_dict[(B,B)] = [12621, 1]
...

我将其写入csv文件:

for k,v in some_dict.iteritems():
    outf.write(k[0]+","+k[1]+","+str(v[0])+","str(v[1])+"\n")

输出:

A,A,1234,123
A,B,1235,13
A,C,12,12
B,B,12621,1

我想在写入文件之前根据第一个数字“列”对其进行排序(或之后只是重写?)所以输出应该是这样的:

B,B,12621,1
A,B,1235,13
A,A,1234,123
A,C,12,12
     ^ 
     Sorted on this 'column'

我该怎么做?该文件非常大,所以我想在写之前这样做会更好。

2 个答案:

答案 0 :(得分:4)

对字典项进行排序; sorted() function使用key函数来确定要排序的内容;对于(key, value)元组,请使用lambda:

sorted_data = sorted(some_dict.iteritems(), key=lambda i: i[1][0], reverse=True)
for (k1, k2), (v1, v2) in sorted_data:

我首先使用reverse=True来获得更大的值。

尽量避免重新发明轮子,有一个很好的csv module可供您使用:

import csv

with open(filename, 'wb') as f:
    writer = csv.writer(f)
    for (k1, k2), (v1, v2) in sorted(some_dict.iteritems(), key=lambda i: i[1][0]):
        writer.writerow([k1, k2, v1, v2])

并且您不必将整数显式转换为字符串。

答案 1 :(得分:1)

使用sorted() function内置函数并指定要排序的键:

for k,v in sorted(some_dict.iteritems(), key=lambda t: t[1][0]):
    print k,v

#output:
(A, C) [12, 12]
(A, A) [1234, 123]
(A, B) [1235, 13]
(B, B) [12621, 1]

要从大到小排序,只需设置reverse关键字参数:

for k,v in sorted(some_dict.iteritems(), key=lambda t: t[1][0], reverse=True):