Сортировать список числовых строк в порядке возрастания - PullRequest
48 голосов
/ 18 марта 2012

Я создал базу данных sqlite, в которой есть таблица, в которой хранятся значения температуры. Значения температуры записываются в базу данных в порядке возрастания в первый раз. Затем я считываю значения температуры из базы данных в список, а затем добавляю этот список в поле со списком, чтобы выбрать температуру - работает отлично.

Результирующий список, скажем:

templist = ['25', '50', '100', '150', '200', '250', '300'].

Затем я добавляю новое значение температуры, скажем, «33» в базу данных.

Добавляется в конец таблицы. Если я сейчас читаю температуру, список станет:

['25', '50', '100', '150', '200', '250', '300', '33']. 

Если я сделаю templist.sort() или sorted(templist), конечный результат будет

['150', '200', '25', '250', '300', '33', '50']

Есть ли какой-нибудь простой способ отсортировать список по возрастанию, чтобы я получил:

['25', '33', '50', '100', '150', '200', '250', '300']

Ответы [ 2 ]

73 голосов
/ 18 марта 2012

Рекомендуемый подход в этом случае заключается в сортировке данных в базе данных, добавляя ORDER BY в конце запроса, который выбирает результаты, что-то вроде этого:

SELECT temperature FROM temperatures ORDER BY temperature ASC;  -- ascending order
SELECT temperature FROM temperatures ORDER BY temperature DESC; -- descending order

Если по какой-то причине это невозможно, вы можете изменить порядок сортировки в Python следующим образом:

templist = [25, 50, 100, 150, 200, 250, 300, 33]
sorted(templist, key=int)               # ascending order
> [25, 33, 50, 100, 150, 200, 250, 300]
sorted(templist, key=int, reverse=True) # descending order
> [300, 250, 200, 150, 100, 50, 33, 25]

Как было указано в комментариях, ключ int (или float, если хранятся значения с десятичными знаками) необходим для правильной сортировки данных, если полученные данные имеют тип string, но это ' Было бы очень странно хранить значения температуры в виде строк, если это так, вернитесь и исправьте проблему в корне и убедитесь, что сохраняемые температуры являются числами.

29 голосов
/ 18 марта 2012

в python sorted работает так, как вы хотите, с целыми числами:

>>> sorted([10,3,2])
[2, 3, 10]

похоже, у вас есть проблема, потому что вы используете строки:

>>> sorted(['10','3','2'])
['10', '2', '3']

(потому что порядок строкначинается с первого символа, а «1» предшествует «2», независимо от того, какие символы следуют), что можно исправить с помощью key=int

>>> sorted(['10','3','2'], key=int)
['2', '3', '10']

, который преобразует значения в целые числа во время сортировки (itвызывается как функция - int('10') возвращает целое число 10)

и, как предлагается в комментариях, вы также можете отсортировать сам список, а не генерировать новый:

>>> l = ['10','3','2']
>>> l.sort(key=int)
>>> l
['2', '3', '10']

но я бы посмотрел, почему у тебя вообще есть струны.Вы должны быть в состоянии сохранить и получить целые числа.похоже, что вы сохраняете строку, когда вы должны сохранить int?(sqlite необычен для баз данных, поскольку он хранит данные в том же виде, что и заданный, даже если тип столбца таблицы отличается).

и, как только вы начнете сохранять целые числа, вы также можетевернуть список обратно из sqlite, добавив order by ... к команде sql:

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