Python .sort () не работает должным образом - PullRequest
8 голосов
/ 03 октября 2009

Решая несколько задач головоломки тихим субботним вечером (уууууу ... нет), я борюсь с сортировкой (). Результаты не совсем то, что я ожидаю. Программа просматривает каждую комбинацию от 100 до 999 и проверяет, является ли продукт палиндомом. Если это так, добавьте в список. Мне нужен отсортированный список: D Вот моя программа:

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]

какие сети:

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

Очевидно, что индекс 0 больше, чем 1. Есть идеи, что происходит? Я чувствую, что это как-то связано с концевыми / ведущими нулями, но я бросил быстрый взгляд и не вижу проблемы.

Бонусные баллы, если вы знаете, откуда взялась головоломка: P

Ответы [ 8 ]

21 голосов
/ 03 октября 2009

Вы сортируете строки, а не числа. '101101' < '10201' потому что '1' < '2'. Измените list.append(reversed) на list.append(int(reversed)), и оно будет работать (или использовать другую функцию сортировки).

12 голосов
/ 03 октября 2009

Сортировка делает свое дело. Если вы намеревались хранить целые числа в списке, воспользуйтесь советом Лукаша. Вы также можете указать, как сортировать, например, с помощью целых чисел:

list.sort(key=int)

ключевой параметр принимает функцию, которая вычисляет элемент, чтобы занять место объекта списка во всех сравнениях. Целое число будет сравниваться численно, как вы ожидаете.

(Кстати, list - действительно плохое имя переменной, так как вы переопределяете встроенный тип list ()!)

2 голосов
/ 03 октября 2009

Ваш список содержит строки, поэтому он сортирует их по алфавиту - попробуйте преобразовать список в целые числа, а затем выполните сортировку.

1 голос
/ 12 ноября 2009

Нет необходимости конвертировать в int. Мульт уже является целым числом, и, как вы уже убедились, это палиндром, он будет выглядеть так же, как и обратный, поэтому просто:

list.append(mult)
1 голос
/ 03 октября 2009

Вы сортируете строки, а не числа. Строки сравниваются слева направо.

0 голосов
/ 03 октября 2009

Оператор компаратора обрабатывает ваш ввод как строки, а не как целые числа. В сравнении строк 2 третья буква лексически больше 1. reversed = str(mult)[::-1]

0 голосов
/ 03 октября 2009

Нет, она сортируется правильно, просто она сортируется лексографически , и вы хотите числовую сортировку ... поэтому удалите "str ()"

0 голосов
/ 03 октября 2009

Ваши числа хранятся в виде строк, поэтому Python сортирует их соответствующим образом. Итак: «101x» предшествует «102x» (так же, как «abcd» предшествует «az»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...