Python .sort () no funciona como se esperaba

Resolver algunos problemas de rompecabezas en una tranquila noche de sábado (wooohoo … no) y estoy luchando con sort (). Los resultados no son exactamente lo que espero. El progtwig recorre cada combinación de 100 a 999 y verifica si el producto es un palindome. Si es así, adjuntar a la lista. Necesito la lista ordenada: D Aquí está mi progtwig:

list = [] #list of numbers for x in xrange(100,1000): #loops for first value of combination for y in xrange(x,1000): #and 2nd value mult = x*y reversed = str(mult)[::-1] #reverses the number if (reversed == str(mult)): list.append(reversed) list.sort() print list[:10] 

cuales redes:

 ['101101', '10201', '102201', '102201', '105501', '105501', '106601', '108801', '108801', '110011'] 

Claramente, el índice 0 es más grande que 1. ¿Alguna idea de lo que está pasando? Tengo la sensación de que tiene algo que ver con los ceros finales / finales, pero tuve una mirada rápida y no puedo ver el problema.

Puntos de bonificación si sabes de dónde viene el rompecabezas: P

Estás clasificando cadenas, no números. '101101' < '10201' porque '1' < '2' . Cambie list.append(reversed) a list.append(int(reversed)) y funcionará (o usará una función de clasificación diferente).

Sort está haciendo su trabajo. Si desea almacenar números enteros en la lista, siga los consejos de Lukáš. También puede indicar cómo ordenar, por ejemplo, haciendo ints:

 list.sort(key=int) 

el parámetro clave toma una función que calcula un elemento para tomar el lugar del objeto de la lista en todas las comparaciones. Un entero se comparará numéricamente como esperas.

(Por cierto, list es un nombre de variable realmente malo, ya que reemplaza el tipo de lista integrada ())

Su lista contiene cadenas por lo que las está ordenando alfabéticamente. Intente convertir la lista a números enteros y luego haga la clasificación.

Estás ordenando cadenas, no números. Las cadenas se comparan de izquierda a derecha.

No hay necesidad de convertir a int. mult ya es un int y, como lo ha comprobado, es un palíndromo, se verá igual que invertido, así que simplemente:

 list.append(mult) 

Tienes tus números almacenados como cadenas, por lo que Python los clasifica en consecuencia. Entonces: ‘101x’ viene antes de ‘102x’ (de la misma manera que ‘abcd’ vendrá antes de ‘az’).

No, está ordenando correctamente, solo que está ordenando lexográficamente y usted quiere una ordenación numérica … así que elimine el “str ()”

El operador comparador está tratando su entrada como cadenas en lugar de números enteros. En la serie comparsion 2, la tercera letra es léxicamente mayor que 1. reversed = str(mult)[::-1]