2012-03-18 2 views
38

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

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

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'] 
+7

Я бы сказал, что у вас проблемы с типом вещей в вашем списке. Если они сортируются так, они, вероятно, являются строками вместо целых чисел. Не видя кода, который выводит их из sqlite и вашей схемы, сложно предложить правильное решение для вас. –

ответ

57

Рекомендуемый подход в данном случае для сортировки данных в базе данных , добавив 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, но было бы очень странно хранить значения температуры в виде строк, если это так, вернитесь и исправьте проблему в корне, и убедитесь, что температуры, которые хранятся, являются числами.

+0

, используя порядок, будет иметь ту же проблему, если данные являются строками. основная проблема заключается в том, что данные не являются целыми числами. –

+0

@andrewcooke спасибо, исправлено это –

+0

отсортировано (templist, key = float) - именно то, что мне нужно. Спасибо. Я не мог найти трюк «key = float» в любом месте. Я неправильно показал (я изменил его выше), что список, что это список строк, а не список чисел. У меня были проблемы с поплавками в базе данных, в основном при поиске определенного значения (если float не полностью совпадает с числом, которое я ищу, я не получил никаких результатов), поэтому я все изменил на строки. Кажется, проще выполнять различные поиски по строкам, а не по плавающим числам. – linuxoid

25

в питона 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; 
+2

Из 3k ['sorted()' doc] (http://docs.python.org/py3k/library/functions.html#sorted): * Верните новый отсортированный ** список ** из элементов в итерабельном. * –

+0

О, вы правы. извините/спасибо - исправит. –

+1

и на размышлении, что имеет смысл, потому что вам нужно посмотреть на всю последовательность, чтобы отсортировать его, поэтому у вас не может быть генератора сортировки, который позволяет избежать внутреннего списка. –

Смежные вопросы