How to sort a list of strings numerically?
我知道这听起来很简单,但我没有意识到Python的
1 2 3 4 5 6 | list1=["1","10","3","22","23","4","2","200"] for item in list1: item=int(item) list1.sort() print list1 |
给我:
1 | ['1', '10', '2', '200', '22', '23', '3', '4'] |
号
我想要的是
1 | ['1','2','3','4','10','22','23','200'] |
我环顾四周寻找了一些与排序数字集相关的算法,但我发现它们都涉及排序字母数字集。
我知道这可能是一个很简单的问题,但是谷歌和我的教科书没有提供任何比
实际上您还没有将字符串转换为整数。或者更确切地说,你做了,但是你没有对结果做任何事情。你想要的是:
1 2 3 | list1 = ["1","10","3","22","23","4","2","200"] list1 = [int(x) for x in list1] list1.sort() |
。
如果出于某种原因,您需要保留字符串而不是整数(通常是个坏主意,但可能需要保留前导零或其他内容),则可以使用键函数。
1 2 3 | list1 = ["1","10","3","22","23","4","2","200"] # call int(x) on each element before comparing it list1.sort(key=int) |
您可以将函数传递给
1 | list1.sort(key=int) |
btw,要将列表永久转换为整数,请使用
1 | list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x |
号
或列表理解
1 | list1 = [int(x) for x in list1] |
如果您想使用
它返回一个新的排序列表。
Python的种类并不奇怪。只是这个代码:
1 2 | for item in list1: item=int(item) |
。
并没有做你认为应该做的事情——
不管怎样,正确的解决方案是使用
您还可以使用:
1 2 3 4 5 6 7 8 | <wyn> 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 </wyn> |
。
这与你在网上找到的其他东西非常相似,但也适用于字母数字,如[abc0.1,abc0.2….]
希默斯·坎贝尔的回答对Python2.x不起作用。使用
尝试此操作,它将按降序对列表进行排序(在这种情况下不需要指定键):
过程
1 2 3 | listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9] listC = sorted(listB, reverse=True) # listB remains untouched print listC |
号
输出:
1 | [48, 46, 25, 24, 22, 13, 8, -9, -15, -36] |
号
对数字列表进行排序的简单方法
1 2 3 | numlists = [5,50,7,51,87,97,53] numlists.sort(reverse=False) print(numlists) |
。
昨天我处理了同样的问题,发现了一个名为
1 2 3 4 5 6 7 8 9 10 | from natsort import natsorted # Example list of strings a = ['1', '10', '2', '3', '11'] [In] sorted(a) [Out] ['1', '10', '11', '2', '3'] [In] natsorted(a) [Out] ['1', '2', '3', '10', '11'] |
最近的解决方案是正确的。您以字符串形式读取解决方案,在这种情况下,顺序是1,然后是100,然后是104,然后是2,然后是21,然后是2001001010,3等等。
您必须将输入转换为int:
排序字符串:
埃多克斯1〔9〕
排序整数:
埃多克斯1〔10〕
要进行强制转换,只需将字符串列表放入int(blahblah)中即可。
再一次:
1 2 3 4 5 6 7 | stringList = (1, 10, 2, 21, 3) newList = int (stringList) print newList => returns (1, 2, 3, 10, 21) |
。
python3排序功能:
1 2 3 4 | if __name__== '__main__': n = list(input()) print(n) print(sorted(n)) |
号
如果您想使用数字串,最好使用另一个列表,如我的代码所示,它会很好地工作。
1 2 3 4 5 6 7 8 9 10 11 | list1=["1","10","3","22","23","4","2","200"] k=[] for item in list1: k.append(int(item)) k.sort() print(k) |
号
1 2 3 | scores = ['91','89','87','86','85'] scores.sort() print (scores) |
这对我使用Python3版很有效,但在版本2中没有。