2010-08-06 25 views
69

Sé que esto suena trivial, pero no me di cuenta de que la función sort() de Python era extraña. Tengo una lista de "números" que en realidad están en forma de cadena, así que primero los convierto en enteros, luego intento un ordenamiento.¿Cómo ordenar una lista numéricamente?

list1=["1","10","3","22","23","4","2","200"] 
for item in list1: 
    item=int(item) 

list1.sort() 
print list1 

me da:

['1', '10', '2', '200', '22', '23', '3', '4'] 

Lo que yo quiero es

['1','2','3','4','10','22','23','200'] 

He mirado en torno a algunos de los algoritmos asociados con la clasificación de los conjuntos numéricos, pero los que encuentran en todo implica ordenar conjuntos alfanuméricos.

Sé que este es probablemente un problema obvio, pero google y mi libro de texto no ofrecen nada más o menos útil que la función .sort().

+7

Tenga en cuenta que su bucle for no hace lo que sospecho que cree que hace. – deinst

+1

En ningún momento actualizó 'list1'. ¿Qué te hizo pensar que 'list' se estaba actualizando? –

+0

El problema similar aumenta cuando list1 = ['1', '1.10', '1.11', '1.1', '1.2'] se proporciona como entrada. En lugar de obtener resultados como ['1', '1.1', '1.2', '1.10', '1.11'], obtengo ['1', '1.1', '1.10', '1.11', '1.2' ] – sathish

Respuesta

127

En realidad no ha convertido sus cadenas a enteros. O mejor dicho, lo hiciste, pero luego no hiciste nada con los resultados. Lo que queremos es:

list1 = ["1","10","3","22","23","4","2","200"] 
list1 = [int(x) for x in list1] 
list1.sort() 

Sin embargo, pitón hace que sea aún más fácil para usted: Ordenar toma un parámetro clave llamada, que es una función que se llama en cada elemento antes de que se compara (pero sin modificar la lista)

list1 = ["1","10","3","22","23","4","2","200"] 
# call int(x) on each element before comparing it 
list1.sort(key=int) 
+6

cuando intento key = int en 2.7 Obtengo None – KI4JGT

+0

@ KI4JGT: Funciona bien con Python 3.3.2. – dfernan

+0

Esto funciona si el elemento list se almacena como "entero", ¿cómo se manejará en caso de valores float? Ej., List1 = [1, 1.10, 1.11, 1.1, 1.2] – sathish

28

Puede pasar una función al parámetro key al the .sort method. Con esto, el sistema clasificará por clave (x) en lugar de x.

list1.sort(key=int) 

Por cierto, para convertir la lista de números enteros de forma permanente, utilice the map function

list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x 

o lista por comprensión

list1 = [int(x) for x in list1] 
8

El tipo de Python no es raro. Es sólo que este código:

for item in list1: 
    item=int(item) 

no está haciendo lo que creo que es - item no se sustituye de nuevo en la lista, se desechan.

De todos modos, la solución correcta es usar key=int como otros le han mostrado.

+0

¡Ooh, ese es un buen punto! ¡Gracias! – Brian

13

En caso de que quiera utilizar sorted() función: sorted(list1, key=int)

Devuelve una nueva lista ordenada.

-1

La solución más reciente es la correcta. Está leyendo soluciones como una cadena, en cuyo caso el orden es 1, luego 100, luego 104 seguido de 2, luego 21, luego 2001001010, 3 y así sucesivamente.

tienen que desechar la entrada como int en lugar:

cadenas ordenados:

stringList = (1, 10, 2, 21, 3)

enteros ordenados:

intList = (1, 2, 3, 10, 21)

Para emitidos, sólo hay que poner el StringList dentro int (blahblah).

Una vez más:

stringList = (1, 10, 2, 21, 3) 

newList = int (stringList) 

print newList 

=> returns (1, 2, 3, 10, 21) 
+0

TypeError: el argumento int() debe ser una cadena o un número, no 'tuple' –

+0

Además, las cadenas en su lista de cadenas deben tener comillas. – Teepeemm

+1

Esa es una predicción increíble: "la solución más reciente es la correcta";) – GreenAsJade

-1
scores = ['91','89','87','86','85'] 
scores.sort() 
print (scores) 

Esto funcionó para mí usando Python versión 3, a pesar de que no lo hizo en la versión 2.

+0

Intenta ordenar con '11 y '100' allí, ahí es cuando las cosas se ponen interesantes. – Penz

5

También puede utilizar:


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 
 

esto es muy similar para otras cosas que puedes encontrar en internet pero también funciona para alfanuméricos como [abc0.1, abc0.2 ..]

3

La respuesta de Seamus Campbell no funciona en python2.x.
list1 = sorted(list1, key=lambda e: int(e)) usando la función lambda funciona bien.

Cuestiones relacionadas