Python - как отсортировать список числовых значений в порядке возрастания
Я создал базу данных 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']
Ответы
Ответ 1
Рекомендуемый подход в этом случае заключается в сортировке данных в базе данных, добавлении 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
, но это ' d очень странно сохранять значения температуры в виде строк, если это так, вернитесь и исправьте проблему в корне, и убедитесь, что сохраненные температуры являются числами.
Ответ 2
в 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']
который преобразует значения в целые числа во время сортировки (он вызывается как функция - 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;