Je sais que cela semble trivial mais je ne savais pas que la sort()
fonction de Python était bizarre. J'ai une liste de "nombres" qui sont en fait sous forme de chaîne, donc je les convertis d'abord en entiers, puis j'essaye un tri.
list1=["1","10","3","22","23","4","2","200"]
for item in list1:
item=int(item)
list1.sort()
print list1
Donne moi:
['1', '10', '2', '200', '22', '23', '3', '4']
Ce que je veux c'est
['1','2','3','4','10','22','23','200']
J'ai cherché certains des algorithmes associés au tri des ensembles numériques, mais ceux que j'ai trouvés impliquent tous le tri des ensembles alphanumériques.
Je sais que c'est probablement un problème évident, mais Google et mon manuel n'offrent rien de plus ou de moins utile que la .sort()
fonction.
list1
. Qu'est-ce qui vous a fait penserlist
que la mise à jour était en cours?sorted(mylist)
Réponses:
Vous n'avez pas réellement converti vos chaînes en entiers. Ou plutôt, vous l'avez fait, mais vous n'avez rien fait avec les résultats. Ce que tu veux c'est:
Si, pour une raison quelconque, vous devez conserver des chaînes au lieu des entiers (généralement une mauvaise idée, mais peut-être que vous devez conserver les zéros non significatifs ou quelque chose), vous pouvez utiliser une fonction clé .
sort
prend un paramètre nommé,,key
qui est une fonction appelée sur chaque élément avant sa comparaison. Les valeurs de retour de la fonction clé sont comparées au lieu de comparer directement les éléments de la liste:la source
list1 = list1.sort(key=int)
, utilisez justelist1.sort(key=int)
et list1 sera déjà trié.Vous pouvez passer une fonction au
key
paramètre à la.sort
méthode . Avec cela, le système triera par clé (x) au lieu de x.BTW, pour convertir la liste en nombres entiers de manière permanente, utilisez la
map
fonctionou compréhension de liste
la source
Si vous souhaitez utiliser la
sorted()
fonction:sorted(list1, key=int)
Il renvoie une nouvelle liste triée.
la source
Le genre de Python n'est pas bizarre. C'est juste que ce code:
ne fait pas ce que vous pensez que c'est -
item
n'est pas replacé dans la liste, il est simplement jeté.Quoi qu'il en soit, la bonne solution est d'utiliser
key=int
comme d'autres vous l'ont montré.la source
Vous pouvez aussi utiliser:
Ceci est très similaire à d'autres choses que vous pouvez trouver sur Internet, mais fonctionne également pour les alphanumériques comme
[abc0.1, abc0.2, ...]
.la source
J'ai abordé le même problème hier et j'ai trouvé un module appelé [natsort] [1], qui résout votre problème. Utilisation:
Il fonctionne également pour les dictionnaires comme un équivalent de
sorted
. [1]: https://pypi.org/project/natsort/la source
La réponse de Seamus Campbell ne fonctionne pas sur python2.x.
list1 = sorted(list1, key=lambda e: int(e))
l'utilisation de lalambda
fonction fonctionne bien.la source
Essayez ceci, cela triera la liste sur place par ordre décroissant (il n'est pas nécessaire de spécifier une clé dans ce cas):
Processus
production:
la source
La solution la plus récente est la bonne. Vous lisez les solutions sous forme de chaîne, auquel cas l'ordre est 1, puis 100, puis 104 suivi de 2 puis 21, puis 2001001010, 3 et ainsi de suite.
Vous devez CAST votre entrée comme un int à la place:
chaînes triées:
stringList = (1, 10, 2, 21, 3)
ints triés:
intList = (1, 2, 3, 10, 21)
Pour lancer, mettez simplement la stringList à l'intérieur de int (blahblah).
Encore:
la source
Si vous souhaitez utiliser des chaînes de nombres, mieux vaut prendre une autre liste comme indiqué dans mon code, cela fonctionnera bien.
la source
Un moyen simple de trier une liste numérique
la source
Le vrai problème est que le tri trie les choses par ordre alphanumérique. Donc, si vous avez une liste ['1', '2', '10', '19'] et exécutez sort, vous obtenez ['1', '10'. «19», «2»]. c'est-à-dire que 10 vient avant 2 car il regarde le premier caractère et trie à partir de cela. Il semble que la plupart des méthodes en python retournent les choses dans cet ordre. Par exemple, si vous avez un répertoire nommé abc avec les fichiers étiquetés comme 1.jpg, 2.jpg etc., dites jusqu'à 15.jpg et que vous faites file_list = os.listdir (abc), la file_list n'est pas ordonnée comme vous le souhaitez mais plutôt comme file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Si l'ordre dans lequel les fichiers sont traités est important (c'est probablement pour cela que vous les avez nommés numériquement), l'ordre n'est pas ce que vous pensez qu'il sera. Vous pouvez éviter cela en utilisant un remplissage "zéros". Par exemple, si vous avez une liste alist = ['01', '03', '05', '10', '02', '04', '06] et que vous exécutez le tri dessus, vous obtenez l'ordre souhaité. alist = ['01', '02' etc] car le premier caractère est 0 qui précède 1. La quantité de zéros dont vous avez besoin est déterminée par la plus grande valeur de la liste. Par exemple, si la plus grande est comprise entre 100 et 100. 1000, vous devez remplir des chiffres uniques comme 001, 002 --- 010,011--100, 101 etc.
la source
Cela a fonctionné pour moi en utilisant la version 3 de python, bien que ce ne soit pas le cas dans la version 2.
la source