2012-02-25 11 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),.........] 

लगभग शब्दकोश में 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', पूर्णांक)]

यहां मेरा कोड है जहां मैं एक शब्दकोश में एक टेक्स्ट फ़ाइल में पढ़ रहा हूं, एक सूची में परिवर्तित हो रहा हूं और नेस्टेड सूची में पहले आइटम द्वारा सॉर्ट करने के लिए इस्तेमाल किए गए आइटमजटर । मुझे कोड में शब्दकोश की आवश्यकता है क्योंकि मैं कुंजी पर मूल्यों को देखने के लिए इस पर निर्भर करता हूं। एक बार सभी प्रक्रियाओं को चलाने के बाद मैं आउटपुट फ़ाइल के लिए शब्दकोश को सॉर्ट करने की कोशिश कर रहा हूं। किसी भी मदद के लिए धन्यवाद।

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" एच: \ स्वाट \ एनसी \ FID_Whole_Copy.txt ")' – kev

उत्तर

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() विधि नहीं है। आपके "[के, वी में FID_GC_dict.iteritems()]" वाक्यविन्यास गलत है - "के लिए कोई" नहीं है, इसलिए यह "[के, (v FID_GC_dict.iteritems() में v)] आपके अंतिम दो में से कोई भी नहीं" एक पंक्तिबद्ध ट्यून किया गया "जवाब काम करेगा, क्योंकि आपने अपनी गलतियों को जोड़ दिया है। मैंने कभी जवाब नहीं दिया है, लेकिन मैं इस समय बहुत मोहक हूं। लिंडा: कृपया इस" उत्तर "से पायथन सीखें। @ इग्नसियो वाज़्यूज़ -अब्रम्स संक्षेप में, लेकिन सही था, और इसके विपरीत, भ्रामक नहीं। – DSM

+0

हां मैंने इसे पहुंचाया, यह परीक्षण नहीं किया गया था और मैंने सोचा था कि एक सूची पर क्रमबद्ध एक पुनरावर्तनीय लौटाया गया है। यह मेरे नोट्स ऊपर नहीं है और उत्तर पूरी तरह से बदला गया है फीडबैक डीएसएम के लिए धन्यवाद कुछ बिंदु मुझे याद आएगा। –

+0

डीएसएम की टिप्पणियां अब नहीं रहती हैं, जवाब अपडेट किया गया है और उसकी फीडबैक –

14

ऐसा इसलिए है क्योंकि वे तार हैं।

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

आप झूमने !! बहुत बहुत धन्यवाद! – Linda

+0

कोई कुंजी = int (itemgetter (0) क्यों नहीं कर सकता है? मुझे यह त्रुटि मिलती है: TypeError: int() तर्क एक स्ट्रिंग या संख्या होना चाहिए, न कि 'operator.itemgetter'। ओह ठीक है, मैं लैम्ब्डा का उपयोग करूंगा। –

+0

@ tommy.carstensen: 'operator.itemgetter()' एक फ़ंक्शन देता है। आप फ़ंक्शन को पूर्णांक में परिवर्तित नहीं कर सकते हैं। –

संबंधित मुद्दे