关于python:如何用数字排序字符串列表?

How to sort a list of strings numerically?

我知道这听起来很简单,但我没有意识到Python的sort()函数很奇怪。我有一个实际上是字符串形式的"数字"列表,所以我首先将它们转换为整数,然后尝试排序。

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']

我环顾四周寻找了一些与排序数字集相关的算法,但我发现它们都涉及排序字母数字集。

我知道这可能是一个很简单的问题,但是谷歌和我的教科书没有提供任何比.sort()功能更有用或更不有用的东西。


实际上您还没有将字符串转换为整数。或者更确切地说,你做了,但是你没有对结果做任何事情。你想要的是:

1
2
3
list1 = ["1","10","3","22","23","4","2","200"]
list1 = [int(x) for x in list1]
list1.sort()

如果出于某种原因,您需要保留字符串而不是整数(通常是个坏主意,但可能需要保留前导零或其他内容),则可以使用键函数。sort接受一个命名参数key,它是一个函数,在对每个元素进行比较之前对其进行调用。比较键函数的返回值,而不是直接比较列表元素:

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)


您可以将函数传递给key参数给.sort方法。这样,系统将按键(X)而不是X进行排序。

1
list1.sort(key=int)

btw,要将列表永久转换为整数,请使用map函数

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]


如果您想使用sorted()函数:sorted(list1, key=int)

它返回一个新的排序列表。


Python的种类并不奇怪。只是这个代码:

1
2
for item in list1:
   item=int(item)

并没有做你认为应该做的事情——item没有被替换回列表,只是被丢弃了。

不管怎样,正确的解决方案是使用key=int,正如其他人向您展示的那样。


您还可以使用:

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不起作用。使用lambda函数的list1 = sorted(list1, key=lambda e: int(e))运行良好。


尝试此操作,它将按降序对列表进行排序(在这种情况下不需要指定键):

过程

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)


昨天我处理了同样的问题,发现了一个名为natsort的模块,它解决了问题。用途:

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中没有。