2009-10-03 2 views
7

Ein paar Rätselprobleme an einem ruhigen Samstag Nacht (wooohoo ... nicht) und kämpfen mit Art(). Die Ergebnisse sind nicht ganz das, was ich erwarte. Das Programm durchläuft jede Kombination von 100 - 999 und prüft, ob das Produkt ein Palindom ist. Wenn dies der Fall ist, fügen Sie sie der Liste hinzu. Ich brauche die Liste sortiert: D Ist hier mein Programm:Python .sort() funktioniert nicht wie erwartet

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] 

die Netze:

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

Klar Index 0 ist größer als 1. Jede Idee, was los ist? Ich habe das Gefühl, dass es etwas mit nachlaufenden/führenden Nullen zu tun hat, aber ich habe mich kurz umgeschaut und kann das Problem nicht sehen.

Bonuspunkte, wenn Sie wissen, wo das Puzzle kommt: P

+1

Palindrome Kumpel – whatnick

+2

Es ist von Project Euler, glaube ich. –

+0

@ J S: Bingo: D –

Antwort

20

Sie Strings werden Sortierung, keine Zahlen. '101101' < '10201' weil '1' < '2'. Ändern Sie list.append(reversed) zu list.append(int(reversed)) und es funktioniert (oder verwenden Sie eine andere Sortierfunktion).

+6

Oh Mann ... gerade als ich dachte, dass ich von noob graduierte, um Anfänger;) Danke! –

0

Sie haben Ihre Zahlen als Strings gespeichert, also python sortiert sie entsprechend. Also: '101x' kommt vor '102x' (genauso wie 'abcd' vor 'az' kommt).

0

Nein, es ist die Sortierung richtig, nur, dass es lexographically ist das Sortieren und Sie numerische Sortierung ... so entfernen Sie die „str()“

+1

Zu einem anderen Thema könnte Ihr Programm optimiert werden. Tipp: ** erzeuge ** die Zahlen .. – aviraldg

+0

Ja, ich weiß, und ich könnte sie später kompilieren, aber es ist schnell genug für die Aufgabe zur Hand. –

1

Sie Sortier Saiten, keine Zahlen. Strings vergleichen von links nach rechts.

2

Ihre Liste enthält Zeichenfolgen, so dass sie alphabetisch sortiert werden - versuchen Sie, die Liste in Ganzzahlen zu konvertieren und dann die Sortierung durchzuführen.

0

Der Vergleichsoperator behandelt Ihre Eingabe als Strings anstelle von Ganzzahlen. In String Compartion 2 als der 3. Buchstabe ist lexikalisch größer als 1. reversed = str(mult)[::-1]

11

Sortierung macht ihren Job. Wenn Sie beabsichtigen, ganze Zahlen in der Liste zu speichern, nehmen Sie Lukáš-Rat. Sie können auch sagen, wie Art, indem sie Ints zum Beispiel sortieren:

list.sort(key=int) 

der Schlüsselparameter nimmt eine Funktion, die ein Element berechnet die Liste Objekt in allen Vergleichen zu nehmen. Eine Ganzzahl wird numerisch wie erwartet verglichen.

(By the way, list sind ein wirklich schlechten Variablennamen, wie Sie die eingebaute Liste außer Kraft setzen() geben!)

1

Keine Notwendigkeit, in int zu konvertieren. mult bereits ein int ist und wie Sie überprüft haben, es ist ein Palindrom es das gleiche wie umgekehrt aussehen wird, so einfach:

list.append(mult)