2009-10-03 25 views
7

Zwalczanie kilku problemów z układankami w spokojną sobotnią noc (wooohoo ... nie) i walczę z sortowaniem(). Rezultaty nie są takie, jakich się spodziewam. Program przechodzi przez każdą kombinację od 100 do 999 i sprawdza, czy produkt jest palindromem. Jeśli tak, dołącz do listy. Potrzebuję listę posortowaną: D Oto mój program:Python .sort() nie działa zgodnie z oczekiwaniami

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] 

który Siatki:

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

Wyraźnie indeks 0 jest większy niż 1. Każdy pomysł co się dzieje? Mam przeczucie, że ma coś wspólnego z końcowymi zerami, ale miałem szybkie spojrzenie i nie widzę problemu.

punkty, jeśli wiesz, gdzie puzzle pochodzi z: P

+1

Palindrome kolega – whatnick

+2

To od projektu Eulera, myślę. –

+0

@ J S: Bingo: D –

Odpowiedz

20

Jesteś sortowania ciągi, a nie liczbami. '101101' < '10201' ponieważ '1' < '2'. Zmień list.append(reversed) na list.append(int(reversed)) i będzie działać (lub użyj innej funkcji sortowania).

+6

Oh man ... właśnie kiedy myślałem, że kończę z noobem, do nowicjusza;) Dzięki! –

0

Masz swoje numery przechowywane jako ciągi, więc pyton odpowiednio je sortuje. A więc: "101x" występuje przed "102x" (taki sam jak "abcd" pojawi się przed "az").

0

Nie, to jest sortowanie prawidłowo, tylko że jest sortowanie lexographically i chcesz numeryczną sortowania ... więc usunąć „str()”

+1

W oddzielnym temacie Twój program może zostać zoptymalizowany. Podpowiedź: ** generuj ** liczby .. – aviraldg

+0

Tak, wiem, i mogę je później skompilować, ale jest wystarczająco szybki, aby wykonać zadanie. –

1

Ty sortowania struny, a nie liczbami. Ciągi porównują od lewej do prawej.

2

Twoja lista zawiera ciągi, więc sortuje je alfabetycznie - spróbuj przekształcić listę w liczby całkowite, a następnie sortuj.

0

Operator porównania traktuje dane wejściowe jako ciągi, zamiast liczb całkowitych. W porównywaniu ciągów 2 jako trzecia litera jest leksykalnie większa niż 1. reversed = str(mult)[::-1]

11

Sort wykonuje swoją pracę. Jeśli chcesz przechowywać liczby całkowite na liście, weź radę Lukáša. Można również powiedzieć, jak porządek sortowania, na przykład poprzez wskazówki:

list.sort(key=int) 

kluczowym parametrem wykonuje funkcję, która oblicza pozycję odbędzie wykazie obiektów we wszystkich porównaniach. Liczba całkowita będzie porównywać liczbowo zgodnie z oczekiwaniami.

(Nawiasem mówiąc, list jest naprawdę zła nazwa zmiennej, jak zastąpić listę wbudowanego() typ!)

1

ma potrzeby konwertowania na int. mult już jest int i jak masz zaznaczone jest palindrom będzie wyglądać tak samo jak odwrócony, więc po prostu:

list.append(mult) 
Powiązane problemy