按第一项排序嵌套列表 - itemgetter没有做到这一点

时间:2012-02-25 18:45:41

标签: python list sorting nested

我有一个字典,我已经转换为列表,所以我可以按第一项排序。字典中的键是一个字符串(数字),该值是一个在列表中保留的整数 字典转换中的列表如下所示:

[('228055', 1), ('228054', 1), ('228057', 2), ('228056', 1), ('228051', 1), ('228050', 1),     ('228053', 1), ('203184', 6), ('228059', 1), ('228058', 1), ('89370', 2), ('89371', 3), ('89372', 2), ('89373', 1), ('89374', 1), ('89375', 1), ('89376', 1), ('89377', 1), ('89378', 1), ('89379', 1),.........]

字典中有大约240,000个项目。我想通过第一个索引对字典进行排序,但是当我使用itemgetter(0)时,它首先按照所有“1”对列表进行排序。列出的排序如下:

[('0', 3), ('1', 3), ('10', 3), ('100', 4), ('1000', 3), ('10000', 1), ('100000', 3), ('100001', 2), ('100002', 3), ('100003', 3), ('100004', 2), ('100005', 2), ('100006', 2), ('100007', 2), ('100008', 2), ('100009', 2), ('10001', 1), ('100010', 3), ('100011', 3), ('100012', 3), ('100013', 2), ('100014', 1), ('100015', 1), ('100016', 1), ('100017', 1), ('100018', 1), ....]

我希望列表按['0',3),('1',3),('2',整数),('3',整数)排序​​,...('240,000 ',整数)]

这是我的代码,我在文本文件中读取字典,转换为列表并使用itemgetter按嵌套列表中的第一项进行排序。我需要代码中的字典,因为我非常依赖它来按键查找值。我只是在运行所有进程后尝试为输出文件排序字典。谢谢你的帮助。

import sys, string, csv, arcpy, os, fileinput, traceback
from arcpy import env
from operator import itemgetter


#Creating a dictionary of FID: LU_Codes from external txt file
text_file = open("H:\SWAT\NC\FID_Whole_Copy.txt", "rb")
#Lines = text_file.readlines()
FID_GC_dict =  dict()
reader = csv.reader(text_file, delimiter='\t')
for line in reader:
    FID_GC_dict[line[0]] = int(line[1])
text_file.close()

dict_List = [(x, FID_GC_dict[x]) for x in FID_GC_dict.keys()]
dict_List.sort(key=itemgetter(0))
print dict_List

2 个答案:

答案 0 :(得分:15)

那是因为他们是字符串。

key=lambda x: int(x[0])

答案 1 :(得分:11)

更改密钥以将字符串转换为int将有助于您,此处还有一些其他排序技巧。

from operator import itemgetter

list_to_sort=[('89372', 2), ('89373', 1), ('89374', 1), ('89375', 1), ('89376', 1),     ('89377', 1), ('228055', 1), ('228054', 1), ('228057', 2), ('228056', 1), ('228051', 1), ('228050', 1),('228053', 1), ('203184', 6), ('228059', 1), ('228058', 1), ('89370', 2), ('89371', 3), ('89372', 2), ('89373', 1), ('89374', 1), ('89375', 1), ('89376', 1), ('89377', 1)]
print list_to_sort

list_to_sort.sort()
print list_to_sort # badly sorted as described

list_to_sort.sort(key=itemgetter(0))
print list_to_sort # badly sorted as described (same as above)

list_to_sort.sort(key=lambda x: int(x[0]))
print list_to_sort # sorted well

list_to_sort.sort(key=lambda x: int(x[0]), reverse=True)
print list_to_sort # sorted well in reverse

关于构建列表以从dict中排序的附注。 iteritems()是使用以下

执行操作的更好方法
dict_List = [(x, FID_GC_dict[x]) for x in FID_GC_dict.keys()]

dict_List = [(k,v) for k,v in FID_GC_dict.iteritems()]