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

时间:2012-03-18 14:06:44

标签: python list sorting

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

2 个答案:

答案 0 :(得分:73)

在这种情况下,推荐的方法是对数据库中的数据进行排序,在查询结尾处添加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]

正如评论中所指出的,如果收到的数据类型为{{1},则需要int密钥(如果存储了带小数的值,则为float)以正确排序数据但是将温度值存储为字符串会很奇怪,如果是这种情况,请返回并修复根部的问题,并确保存储的温度是数字。

答案 1 :(得分:29)

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命令来获取从sqlite排序的列表:

select temperature from temperatures order by temperature;