web-dev-qa-db-fra.com

Trier une liste de chaînes numériques par ordre croissant

J'ai créé une base de données sqlite qui a une table qui stocke les valeurs de température. Les valeurs de température sont écrites dans la base de données par ordre croissant pour la première fois. Ensuite, j'ai lu les valeurs de température de la base de données dans une liste, puis ajouté cette liste à une liste déroulante pour sélectionner les températures.

La liste résultante est, disons:

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

Ensuite, j'ajoute une nouvelle valeur de température, disons '33' à la base de données.

Il est ajouté à la fin de la table. Si je lis les températures maintenant, la liste deviendra:

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

Si je fais templist.sort() ou sorted(templist), le résultat final est

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

Existe-t-il un moyen simple de trier la liste par ordre croissant afin d’obtenir:

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

Dans ce cas, l’approche recommandée consiste à trier les données de la base de données en ajoutant un ORDER BY à la fin de la requête qui récupère les résultats, à peu près comme ceci:

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

Si, pour une raison quelconque, ce n'est pas une option, vous pouvez modifier l'ordre de tri comme ceci 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]

Comme indiqué dans les commentaires, la clé int (ou float si des valeurs avec des décimales sont stockées) est nécessaire pour trier correctement les données si les données reçues sont de type string, mais il serait très étrange de stocker les valeurs de température sous forme de chaînes. Si c'est le cas, revenez en arrière et corrigez le problème à la racine, et assurez-vous que les températures enregistrées sont des nombres.

73
Óscar López

in python sorted fonctionne comme vous le souhaitez avec les entiers:

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

il semble que vous ayez un problème parce que vous utilisez des chaînes:

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

(parce que l'ordre des chaînes commence par le premier caractère, et que "1" précède "2", peu importe les caractères suivants), ce qui peut être corrigé avec key=int

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

qui convertit les valeurs en entiers pendant le tri (on l’appelle comme une fonction - int('10') renvoie l’entier 10)

et comme suggéré dans les commentaires, vous pouvez également trier la liste elle-même, plutôt que d'en générer une nouvelle:

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

mais je voudrais voir pourquoi vous avez des chaînes du tout. vous devriez être capable de sauvegarder et de récupérer des entiers. on dirait que vous enregistrez une chaîne alors que vous devriez enregistrer un int? (sqlite est inhabituel parmi les bases de données, en ce sens qu'il stocke des données dans le même type que celui qui est donné, même si le type de colonne de la table est différent).

et une fois que vous commencez à enregistrer des entiers, vous pouvez également récupérer la liste en commençant par SQLite en ajoutant order by ... à la commande sql:

select temperature from temperatures order by temperature;
29
andrew cooke