2012-03-18 293 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和你的模式的代码,很难为你提供正确的解决方案。 – 2012-03-18 14:10:15

回答

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

如果数据是字符串,则使用order by将会有同样的问题。根本问题是数据不是整数。 – 2012-03-18 14:21:23

+0

@andrewcooke谢谢,修复它 – 2012-03-18 14:27:02

+0

排序(templist,key = float)正是我所需要的。谢谢。我无法在任何地方找到'key = float'的技巧。我错误地显示(我会改变它),列出它是一个字符串列表,而不是数字列表。我在处理数据库中的浮点数时遇到了一些问题,主要是在搜索特定值时(如果浮点数不完全等于我搜索的数字,我没有得到任何结果),这就是为什么我将所有内容都改为字符串。对字符串进行各种搜索似乎比较容易,而不是浮点数。 – linuxoid 2012-03-18 23:37:12

25

在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在数据库中是不常见的,因为它有点类似于存储数据,即使表列类型不同)。

,一旦你开始储蓄整数,你也可以通过添加order by ...到SQL命令得到源码回来排序列表:

select temperature from temperatures order by temperature; 
+2

从3k ['sorted()'doc](http://docs.python.org/py3k/library/functions.html#sorted):*从iterable中的项返回一个新的已排序**列表**。 * – 2012-03-18 14:10:01

+0

哦,你是对的。抱歉/谢谢 - 将解决。 – 2012-03-18 14:14:01

+1

以及有意义的反射,因为您需要查看整个序列以对其进行排序,因此您无法使用避免内部列表的排序生成器。 – 2012-03-18 14:18:00