2012-02-25 14 views
8

Tengo un diccionario que he convertido a una lista para que pueda ordenar por el primer elemento. La clave en el diccionario es una cadena (de números), el valor es un número entero que se mantiene en la lista.
La lista de la conversión diccionario parece:Ordenando una lista de anidamiento por el primer elemento - itemgetter no haciendo el truco

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

hay alrededor de 240.000 artículos en el diccionario. Me gustaría ordenar el diccionario por el primer índice, pero cuando uso itemgetter (0) ordena primero la lista por todos los "1". Las miradas listados ordenados como:

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

me gustaría la lista para ser clasificado por [ '0', 3), ('1', 3), ('2', entero), ('3' , entero), ... ('240,000', entero)]

Aquí está mi código en el que estoy leyendo un archivo de texto en un diccionario, convirtiéndolo en una lista y utilizando itemgetter para ordenar por el primer elemento en la lista anidada . Necesito el diccionario en el código porque dependo mucho de él para buscar valores por la clave. Solo estoy tratando de ordenar el diccionario para el archivo de salida una vez que se ejecutan todos los procesos. Gracias por cualquier ayuda.

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 = abierto (r "H: \ SWAT \ NC \ FID_Whole_Copy.txt")' – kev

Respuesta

7

Cambiar la clave para convertir la cadena a un int le ayudará, también aquí hay algunos otros consejos de clasificación.

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 

Notas al pie sobre la creación de la lista para ordenar desde el dict. iteritems() es una manera más agradable de hacer lo que haces con la siguiente

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

Por favor, pruebe su código antes de publicarlo; estos "consejos" están rotos. Su primera línea "gen_sorted =" no funcionará: un genexp no tiene un método .sort(). Para su "[k, v en FID_GC_dict.iteritems()]" la sintaxis es incorrecta - no hay "para", así que esto es "[k, (v en FID_GC_dict.iteritems())] Ninguno de sus dos últimos" Un alineado afinado "Las respuestas funcionarán, porque has combinado tus errores. Nunca he votado negativamente alguna vez, pero estoy muy tentado esta vez. Linda: por favor no aprendas Python de esta" respuesta ". @ Ignacio Vázquez -Abrams fue conciso, pero correcto, y a diferencia de esto, no es engañoso. – DSM

+0

Sí, me apresuré a esto, no fue probado y pensé que el género en una lista era iterable. No mis notas anteriores y la respuesta ha sido totalmente modificada Gracias por los comentarios de DSM, recordaré algunos puntos. –

+0

Los comentarios de DSM ya no se cumplen, la respuesta se ha actualizado y reparado, probado y verificado según sus comentarios –

14

Eso es porque son cadenas.

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

You rock !! ¡Muchas gracias! – Linda

+0

¿Por qué no se puede hacer key = int (itemgetter (0))? Me sale este error: TypeError: int() El argumento debe ser una cadena o un número, no 'operator.itemgetter'. Oh bueno, usaré lambda. –

+0

@ tommy.carstensen: 'operator.itemgetter()' devuelve una función. No puede convertir una función en un entero. –

Cuestiones relacionadas