web-dev-qa-db-fra.com

Comment trier une liste de chaînes numériquement?

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().

107
Brian

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)
173
Seamus Campbell

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]
36
kennytm

Si vous voulez utiliser sorted() function: sorted(list1, key=int)

Il retourne une nouvelle liste triée.

17
syam

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é.

12
Daniel Roseman

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 ..]

8
Julian

La réponse de Seamus Campbell ne fonctionne pas sur python2.x.
list1 = sorted(list1, key=lambda e: int(e)) utiliser lambda fonctionne correctement.

6
Marx Wolf

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]
3
Mavia

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']
3
rfaenger

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) 
1
clint

Un moyen simple de trier une liste numérique

    numlists = [5,50,7,51,87,97,53]
    numlists.sort(reverse=False)
    print(numlists)
1
sayalok

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)
0
Shaystorm

Fonction de tri Python3:

if __name__== '__main__':
    n = list(input())
    print(n)    
    print(sorted(n))
0
MADHUR GUPTA