如何数字sorting列表?
我知道这听起来微不足道,但我没有意识到Python的sort()
函数是奇怪的。 我有一个实际上是stringforms的“数字”列表,所以我首先将它们转换为整数,然后尝试sorting。
list1=["1","10","3","22","23","4","2","200"] for item in list1: item=int(item) list1.sort() print list1
给我:
['1', '10', '2', '200', '22', '23', '3', '4']
我想要的是
['1','2','3','4','10','22','23','200']
我查找了一些与sorting数字集相关的algorithm,但是我发现的algorithm都涉及sorting字母数字集。
我知道这可能是一个没有道理的问题,但谷歌和我的教科书没有提供比.sort()
函数更有用的东西。
您还没有真正将您的string转换为整数。 或者说,你做了,但是你没有对结果做任何事情。 你想要的是:
list1 = ["1","10","3","22","23","4","2","200"] list1 = [int(x) for x in list1] list1.sort()
但是,python使它更容易:sort需要一个命名参数key,它是在比较每个元素之前调用的函数(但不需要修改列表)
list1 = ["1","10","3","22","23","4","2","200"] # call int(x) on each element before comparing it list1.sort(key=int)
您可以将一个函数传递给.sort
方法的key
参数。 有了这个,系统将按键(x)而不是xsorting。
list1.sort(key=int)
顺便说一句,要将列表永久转换为整数,请使用map
函数
list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x
或列表理解
list1 = [int(x) for x in list1]
如果你想使用sorted()
函数: sorted(list1, key=int)
它返回一个新的sorting列表。
Python的sorting并不奇怪。 这只是这个代码:
for item in list1: item=int(item)
是不是在做你认为的东西 – item
没有被重新放回到列表中,它只是被扔掉了。
无论如何,正确的解决scheme是使用key=int
正如其他人向您展示的那样。
你也可以使用:
import re def sort_human(l): convert = lambda text: float(text) if text.isdigit() else text alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ] l.sort( key=alphanum ) return l
import re def sort_human(l): convert = lambda text: float(text) if text.isdigit() else text alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ] l.sort( key=alphanum ) return l
这是非常相似的其他东西,你可以在互联网上find,但也适用于字母数字如[abc0.1,abc0.2 ..]
Seamus Campbell的答案在python2.x上无效。
使用lambda
函数的list1 = sorted(list1, key=lambda e: int(e))
效果很好。
最近的解决scheme是正确的。 你正在阅读解决scheme作为一个string,在这种情况下,顺序是1,然后100,然后104然后是2然后21,然后2001001010,3等等。
你必须把你的input作为一个int来代替:
sortingstring:
stringList = (1, 10, 2, 21, 3)
整理:
intList = (1, 2, 3, 10, 21)
为了强制转换,只需将stringList放入int(blahblah)。
再次:
stringList = (1, 10, 2, 21, 3) newList = int (stringList) print newList => returns (1, 2, 3, 10, 21)
scores = ['91','89','87','86','85'] scores.sort() print (scores)
这对我使用python版本3,虽然它没有在版本2。