2012-02-25 73 views
8

我有一本字典已轉換爲列表,因此可以按第一項進行排序。字典中的鍵是一個字符串(數字),該值是一個整數,它保留在列表中。
從字典轉換列表看起來像:按第一項排序嵌套列表 - itemgetter沒有做竅門

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

大約有字典中的24萬項。我想按第一個索引對字典進行排序,但是當我使用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 
+1

做的更好的方式'text_file =開放(R 「H:\ SWAT \ NC \ FID_Whole_Copy.txt」)' – kev 2012-02-25 18:53:40

回答

7

更改密鑰字符串轉換爲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 

打造的名單附註從字典排序。 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()] 
+0

請在發佈之前測試您的代碼;這些「提示」被打破。您的第一個「gen_sorted =」行不起作用:genexp沒有.sort()方法。對於你的「[k,v in FID_GC_dict.iteritems()]」語法是錯誤的 - 沒有「for」,所以這是「[k,(v in FID_GC_dict.iteritems())]你最後的兩個」一個調整過的「答案會起作用,因爲你已經把錯誤結合起來了,我從來沒有低調回答過,但是這次我非常試探Linda:請不要從這個」答案「中學習Python @Ignacio Vazquez -Abrams簡潔明瞭,但是正確,與此不同,沒有誤導。 – DSM 2012-02-26 14:33:54

+0

是的,我衝過去了,沒有經過測試,我認爲按照列表返回一個可迭代的結果。 。感謝帝斯曼的反饋,我會記住一些點。 – 2012-02-26 15:31:30

+0

帝斯曼的意見不再成立,答案已經更新,並根據他的反饋進行了修正,測試和驗證 – 2012-02-26 15:38:49

14

這是因爲它們是字符串。

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

你搖滾!非常感謝! – Linda 2012-02-25 19:51:32

+0

爲什麼不能做key = int(itemgetter(0))?我得到這個錯誤:TypeError:int()參數必須是一個字符串或一個數字,而不是'operator.itemgetter'。哦,我會用lambda。 – 2015-01-14 12:31:36

+0

@ tommy.carstensen:'operator.itemgetter()'返回一個函數。您不能將函數轉換爲整數。 – 2015-01-14 12:34:38