Sort nesting list by first item - itemgetter doesn't do the trick

I have a dictionary that I converted to a list, so I can sort by the first element. The key in the dictionary is a string (of numbers), the value is an integer that is supported in the list.
The list from the dictionary conversion is as follows:

[('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),.........] 

There are about 240,000 items in the dictionary. I would like to sort the dictionary by the first index, but when I use itemgetter (0), it sorts the list by all "1" first. The selected list is as follows:

 [('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), ....] 

I would like the list to be sorted by ['0', 3), ('1', 3), ('2', integer), ('3', integer), ... ('240 000', integer )]

Here is my code, where I read a text file in a dictionary, convert it to a list, and use itemgetter to sort by the first element in a nested list. I need a dictionary in the code because I rely heavily on it to look up values ​​using the key. I'm just trying to sort the dictionary for the output file after starting all the processes. Thanks for any help.

 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 
+8
python sorting list nested
source share
2 answers

Changing the key to convert a string to int will help you, as well as some other sorting tips.

 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 

Side note on creating a list to sort from a dict. iteritems() is the best way to do what you do with the following

 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()] 
+7
source share

This is because these are strings.

 key=lambda x: int(x[0]) 
+14
source share

All Articles