Подтвердить что ты не робот

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']
4b9b3361

Ответ 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;