Dominic Bou-Samra
Dominic Bou-Samra

Reputation: 15416

Python .sort() not working as expected on list of palindromic integers

I am struggling with Python's sort().

My program iterates through every integer combination from 100 to 999 and checks if their products are palindromic. If they are, my program appends the product to a list. I need the list sorted.

Here's my program:

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]

Which nets:

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

Clearly, index 0 is larger then 1. Any idea what's going on? I have a feeling it's got something to do with trailing/leading zeroes, but I had a quick look and I can't see the problem.

Upvotes: 13

Views: 54228

Answers (8)

Neil
Neil

Reputation: 11

No need to convert to int. mult already is an int and as you have checked it is a palindrome it will look the same as reversed, so just:

list.append(mult)

Upvotes: 1

u0b34a0f6ae
u0b34a0f6ae

Reputation: 49803

Sort is doing its job. If you intended to store integers in the list, take Lukáš advice. You can also tell sort how to sort, for example by making ints:

list.sort(key=int)

the key parameter takes a function that calculates an item to take the list object's place in all comparisons. An integer will compare numerically as you expect.

(By the way, list is a really bad variable name, as you override the builtin list() type!)

Upvotes: 13

whatnick
whatnick

Reputation: 5470

The comparator operator is treating your input as strings instead of integers. In string comparsion 2 as the 3rd letter is lexically greater than 1. reversed = str(mult)[::-1]

Upvotes: 0

Justin Ethier
Justin Ethier

Reputation: 134157

Your list contains strings so it is sorting them alphabetically - try converting the list to integers and then do the sort.

Upvotes: 2

pzr
pzr

Reputation: 1256

You're sorting strings, not numbers. Strings compare left-to-right.

Upvotes: 1

aviraldg
aviraldg

Reputation: 9154

No, it is sorting properly, just that it is sorting lexographically and you want numeric sorting... so remove the "str()"

Upvotes: 0

Dana
Dana

Reputation: 32957

You have your numbers stored as strings, so python is sorting them accordingly. So: '101x' comes before '102x' (the same way that 'abcd' will come before 'az').

Upvotes: 0

Lukáš Lalinský
Lukáš Lalinský

Reputation: 41306

You are sorting strings, not numbers. '101101' < '10201' because '1' < '2'. Change list.append(reversed) to list.append(int(reversed)) and it will work (or use a different sorting function).

Upvotes: 25

Related Questions