2012-03-18 33 views
38

He creado una base de datos sqlite que tiene una tabla que almacena valores de temperatura. Los valores de temperatura se escriben en la base de datos en orden ascendente por primera vez. Luego leo los valores de temperatura de la base de datos en una lista y luego agrego esa lista a un cuadro combinado para seleccionar temperaturas: funciona bien.Python: cómo ordenar una lista de valores numéricos en orden ascendente

La lista resultante es, dicen:

templist = ['25', '50', '100', '150', '200', '250', '300']. 

Luego añadir un nuevo valor de temperatura, por ejemplo, '33' a la base de datos.

Se adjunta al final de la tabla. Si leo las temperaturas ahora, la lista se convertirá en:

['25', '50', '100', '150', '200', '250', '300', '33']. 

Si hago templist.sort() o sorted(templist), el resultado final es

['150', '200', '25', '250', '300', '33', '50'] 

¿Hay alguna manera sencilla para ordenar la lista en orden ascendente por lo que me sale:

['25', '33', '50', '100', '150', '200', '250', '300'] 
+7

Diría que tienes problemas con el tipo de cosas en tu lista. Si están ordenando así, probablemente sean cadenas en lugar de enteros. Sin ver el código que los saca de sqlite y su esquema, es difícil proponer la solución adecuada para usted. –

Respuesta

57

Lo que se recomienda en este caso es para ordenar los datos en la base de datos , la adición de un ORDER BY al final de la consulta que obtiene los resultados, algo como esto:

SELECT temperature FROM temperatures ORDER BY temperature ASC; -- ascending order 
SELECT temperature FROM temperatures ORDER BY temperature DESC; -- descending order 

Si por alguna razón que no es una opción, puede cambiar el orden de clasificación de este tipo en Python:

templist = [25, 50, 100, 150, 200, 250, 300, 33] 
sorted(templist, key=int)    # ascending order 
> [25, 33, 50, 100, 150, 200, 250, 300] 
sorted(templist, key=int, reverse=True) # descending order 
> [300, 250, 200, 150, 100, 50, 33, 25] 

Como se ha señalado en los comentarios, la clave int (o float si se almacenan los valores con decimales) se requiere para validar correctamente los datos si los datos recibidos son de tipo string, pero sería muy extraño almacenar valores de temperatura como cadenas, si ese es el caso, retroceda y corrija el problema en la raíz, y asegúrese de que las temperaturas que se almacenan sean números.

+0

usando order by tendrá el mismo problema si los datos son cadenas. el problema subyacente es que los datos no son enteros. –

+0

@andrewcooke gracias, lo arreglé –

+0

ordenado (templist, key = float) es exactamente lo que necesito. Gracias. No pude encontrar ese truco de 'clave = flotar' en ninguna parte. Demostré incorrectamente (lo cambiaré arriba) esa lista que es una lista de cadenas, no una lista de números. Tuve algunos problemas para tratar con flotadores en la base de datos, principalmente cuando buscaba un valor en particular (si un flotador no es totalmente igual al número que busco, no obtuve ningún resultado), es por eso que cambié todo a cadenas. Parece más fácil realizar varias búsquedas en cadenas en lugar de números flotantes. – linuxoid

25

en Python sorted funciona como usted desea con números enteros:

>>> sorted([10,3,2]) 
[2, 3, 10] 

parece que tiene un problema porque está utilizando cadenas:

>>> sorted(['10','3','2']) 
['10', '2', '3'] 

(debido ordenamiento cadena comienza con el primer carácter, y "1" viene antes de "2", no importa lo que los personajes siguen) que puede ser fijado con key=int

>>> sorted(['10','3','2'], key=int) 
['2', '3', '10'] 

que convierte los valores a números enteros durante la clase (que se llama como una función - int('10') devuelve el entero 10)

y como se sugiere en los comentarios, también puede ordenar la lista en sí, en vez de generar una nueva:

>>> l = ['10','3','2'] 
>>> l.sort(key=int) 
>>> l 
['2', '3', '10'] 

pero me gustaría ver en qué usted tiene cadenas en absoluto. deberías poder guardar y recuperar enteros. parece que estás guardando una cadena cuando deberías guardar un int? (sqlite es inusual entre las bases de datos, ya que almacena los datos en el mismo tipo que se le da, incluso si el tipo de columna de la tabla es diferente).

y una vez que comience a ahorrar enteros, también se puede obtener la lista de regreso ordenado de sqlite añadiendo order by ... al comando SQL:

select temperature from temperatures order by temperature; 
+2

Del 3k ['sorted()' doc] (http://docs.python.org/py3k/library/functions.html#sorted): * Devuelve una nueva ** lista ** ordenada de los elementos en iterable. * –

+0

oh, tienes razón. lo siento/gracias - lo arreglaré. –

+1

y en la reflexión que tenga sentido, porque necesita ver una secuencia completa para ordenarla, por lo que no puede tener un generador de clasificación que evite una lista interna. –

Cuestiones relacionadas