Python 按升序对数字字符串列表进行排序

Python 按升序对数字字符串列表进行排序,python,list,sorting,Python,List,Sorting,我创建了一个sqlite数据库,它有一个存储温度值的表。温度值第一次以升序写入数据库。然后,我将数据库中的温度值读取到一个列表中,然后将该列表添加到一个组合框中,以选择温度-工作正常 结果列表是,比如说: templist = ['25', '50', '100', '150', '200', '250', '300']. 然后我向数据库中添加一个新的温度值,比如说'33' 它被追加到表的末尾。如果我现在读取温度,列表将变为: ['25', '50', '100', '150', '200',

我创建了一个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']

在python中,排序的可以像您希望的那样处理整数:

>>> 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在数据库中是不寻常的,因为它以给定的相同类型存储数据,即使表列类型不同)

一旦开始保存整数,您还可以通过将
orderby…
添加到sql命令中,从sqlite重新排序列表:

select temperature from temperatures order by temperature;

在这种情况下,推荐的方法是对数据库中的数据进行排序,在获取结果的查询末尾添加一个
orderby
,如下所示:

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]

正如注释中所指出的,如果接收到的数据类型为
string
,则需要
int
键(或
float
如果存储的是带小数的值)来正确排序数据,但如果是这种情况,将温度值存储为字符串将非常奇怪,返回并从根本上解决问题,确保存储的温度是数字。

从3k开始:从iterable中的项返回一个新的排序列表。在有意义的反思中,因为您需要查看整个序列来排序,所以你不能有一个避免内部列表的排序生成器。为什么不对列表进行适当的排序呢?你可以;我也要补充一点!(我没有提到的原因是,我越来越习惯于python中的生成器和clojure中的惰性序列以及java中guava的iterables中的惰性序列——这是一种非常有用的工作方式,但你忘了它可以改变数据…)我想说,你对列表中的内容类型有问题。如果它们是那样排序的,它们可能是字符串而不是整数。如果看不到将它们从sqlite和您的模式中取出的代码,就很难为您提出正确的解决方案。如果数据是字符串,则使用order by也会有同样的问题。根本的问题是数据不是整数。排序(templast,key=float)正是我需要的。非常感谢。我在任何地方都找不到“key=float”的把戏。我错误地显示(我将在上面更改)该列表是字符串列表,而不是数字列表。我在处理数据库中的浮点数时遇到了一些问题,主要是在搜索特定值时(如果浮点数不完全等于我搜索的数字,我没有得到任何结果),这就是为什么我将所有内容都更改为字符串。对字符串进行各种搜索似乎比对浮点数更容易。