Je sais que cela semble anodin, mais je ne savais pas que la fonction sort()
de Python était étrange. J'ai une liste de "nombres" qui sont en fait sous forme de chaîne, donc je les convertis d'abord en entiers, puis tente 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é des algorithmes associés au tri des ensembles numériques, mais ceux que j'ai trouvés impliquaient tous le tri des ensembles alphanumériques.
Je sais que ce n'est probablement pas un problème, mais Google et mon manuel ne proposent rien de plus ou de moins utile que la fonction .sort()
.
Vous n'avez pas réellement converti vos chaînes en ints. Ou plutôt, vous l'avez fait, mais vous n'avez rien fait avec les résultats. Ce que tu veux c'est:
list1 = ["1","10","3","22","23","4","2","200"]
list1 = [int(x) for x in list1]
list1.sort()
Si, pour une raison quelconque, vous devez conserver des chaînes plutôt que des entiers (généralement une mauvaise idée, mais vous devez peut-être conserver les zéros non significatifs), 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:
list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)
Vous pouvez transmettre une fonction au paramètre key
à la méthode .sort
] . Avec cela, le système va trier par clé (x) au lieu de x.
list1.sort(key=int)
BTW, pour convertir la liste en nombres entiers de façon permanente, utilisez la fonction map
list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x
ou liste de compréhension
list1 = [int(x) for x in list1]
Si vous voulez utiliser sorted()
function: sorted(list1, key=int)
Il retourne une nouvelle liste triée.
Le genre de Python n'est pas étrange. C'est juste que ce code:
for item in list1:
item=int(item)
ne fait pas ce que vous pensez - item
n'est pas replacé dans la liste, il est simplement jeté.
Quoi qu'il en soit, la solution correcte consiste à utiliser key=int
comme d'autres vous l'ont montré.
Vous pouvez aussi utiliser:
import re
def sort_human(l):
convert = lambda text: float(text) if text.isdigit() else text
alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ]
l.sort( key=alphanum )
return l
c'est très similaire pour d'autres choses que vous pouvez trouver sur Internet mais qui fonctionne aussi pour les alphanumériques comme [abc0.1, abc0.2 ..]
La réponse de Seamus Campbell ne fonctionne pas sur python2.x.list1 = sorted(list1, key=lambda e: int(e))
utiliser lambda
fonctionne correctement.
Essayez ceci, il va trier la liste sur place par ordre décroissant (il n’est pas nécessaire de spécifier une clé dans ce cas):
Processus
listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC
sortie:
[48, 46, 25, 24, 22, 13, 8, -9, -15, -36]
Hier, j’ai abordé le même problème et trouvé un module appelé natsort
qui résout les problèmes. Utilisation:
from natsort import natsorted
# Example list of strings
a = ['1', '10', '2', '3', '11']
[In] sorted(a)
[Out] ['1', '10', '11', '2', '3']
[In] natsorted(a)
[Out] ['1', '2', '3', '10', '11']
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 de 21, puis de 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, il suffit de placer la chaîneListe dans int (blahblah).
Encore:
stringList = (1, 10, 2, 21, 3)
newList = int (stringList)
print newList
=> returns (1, 2, 3, 10, 21)
Un moyen simple de trier une liste numérique
numlists = [5,50,7,51,87,97,53]
numlists.sort(reverse=False)
print(numlists)
si vous voulez utiliser une chaîne de nombres, mieux vaut prendre une autre liste comme indiqué dans mon code, cela fonctionnera bien.
list1=["1","10","3","22","23","4","2","200"]
k=[]
for item in list1:
k.append(int(item))
k.sort()
print(k)
Fonction de tri Python3:
if __name__== '__main__':
n = list(input())
print(n)
print(sorted(n))