Python - 如何按升序对数值列表进行排序
我创建了一个具有存储温度值的表的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']
在这种情况下,建议的方法是在数据库中的数据进行排序在该取结果的查询,像这样的结尾处加一个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
类型的,但它会是将温度值存储为字符串非常奇怪,如果是这种情况,请返回并根据问题修复问题,并确保存储的温度是数字。
如果数据是字符串,则使用order by将会有同样的问题。根本问题是数据不是整数。 – 2012-03-18 14:21:23
@andrewcooke谢谢,修复它 – 2012-03-18 14:27:02
排序(templist,key = float)正是我所需要的。谢谢。我无法在任何地方找到'key = float'的技巧。我错误地显示(我会改变它),列出它是一个字符串列表,而不是数字列表。我在处理数据库中的浮点数时遇到了一些问题,主要是在搜索特定值时(如果浮点数不完全等于我搜索的数字,我没有得到任何结果),这就是为什么我将所有内容都改为字符串。对字符串进行各种搜索似乎比较容易,而不是浮点数。 – linuxoid 2012-03-18 23:37:12
在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;
从3k ['sorted()'doc](http://docs.python.org/py3k/library/functions.html#sorted):*从iterable中的项返回一个新的已排序**列表**。 * – 2012-03-18 14:10:01
哦,你是对的。抱歉/谢谢 - 将解决。 – 2012-03-18 14:14:01
以及有意义的反射,因为您需要查看整个序列以对其进行排序,因此您无法使用避免内部列表的排序生成器。 – 2012-03-18 14:18:00
我想说你在列表中的东西的类型有问题。如果他们这样排序,他们可能是字符串而不是整数。没有看到让他们脱离sqlite和你的模式的代码,很难为你提供正确的解决方案。 – 2012-03-18 14:10:15