2009-10-03 35 views
7

Enfrentando algunos problemas de rompecabezas en un tranquilo sábado por la noche (wooohoo ... no) y estoy luchando con sort(). Los resultados no son exactamente lo que espero. El programa itera a través de cada combinación de 100 a 999 y comprueba si el producto es un palindoma. Si es así, añádalo a la lista. Necesito la lista ordenada: D Aquí está mi programa:Python .sort() no funciona como se esperaba

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 Nets:

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

Es evidente que 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 ceros finales/iniciales, pero tuve una mirada rápida y no puedo ver el problema.

puntos de bonificación si saben dónde está el rompecabezas viene de: P

+1

compañero palíndromo – whatnick

+2

Es del Proyecto Euler, creo. –

+0

@ J S: Bingo: D –

Respuesta

20

está ordenando cuerdas, no números. '101101' < '10201' porque '1' < '2'. Cambie list.append(reversed) a list.append(int(reversed)) y funcionará (o use una función de clasificación diferente).

+6

Oh hombre ... justo cuando pensaba que me estaba graduando de novato, a novato;) ¡Gracias! –

0

Tiene sus números almacenados como cadenas, por lo que python los está ordenando según corresponda. Entonces, '101x' viene antes que '102x' (de la misma manera que 'abcd' aparecerá antes que 'az').

0

No, es clasificar correctamente, sólo que se está clasificando lexographically y desea numérico clasificación ... para eliminar la "str()" cuerdas

+1

En un tema separado, su programa podría e optimizado. Sugerencia: ** generar ** los números. – aviraldg

+0

Sí, lo sé, y podría compilarlos más tarde, pero es lo suficientemente rápido para la tarea en cuestión. –

1

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

2

Su lista contiene cadenas para que las ordene alfabéticamente, intente convertir la lista en enteros y luego haga la ordenación.

0

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

11

Sort está haciendo su trabajo. Si tu intención era almacenar enteros en la lista, toma el consejo de Lukáš. También puede decirle cómo ordenar especie, por ejemplo, haciendo enteros:

list.sort(key=int) 

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

(Por cierto, list es un muy mal nombre de la variable, como se ha sobrepasado la lista de orden interna() tipo!)

1

No hay necesidad de convertir a int. mult ya es un entero y como se ha comprobado que es un palíndromo que se verá lo mismo que invierte, por lo que sólo:

list.append(mult) 
Cuestiones relacionadas