如何按数字对字符串列表排序

203 投票
16 回答
396054 浏览
提问于 2025-04-16 02:26

我知道这听起来很简单,但我没意识到Python的sort()函数有点奇怪。我有一个“数字”的列表,但这些数字其实是以字符串的形式存在的,所以我首先把它们转换成整数,然后再尝试排序。

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

我查了一些关于数字集合排序的算法,但我找到的都是关于字母数字集合的排序。

我知道这可能是个小问题,但谷歌和我的教科书提供的内容和.sort()函数没有什么特别有用的。

16 个回答

46

你可以给 key 参数传递一个函数,这样在调用 .sort 方法 时,系统会根据 int(x) 的值来排序,而不是直接根据 x 的值。

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

我昨天也遇到了同样的问题,发现了一个叫做 natsort 的模块,它可以解决你的问题。你可以这样使用:

from natsort import natsorted # pip install natsort

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

# Your array may contain strings
[In]  natsorted(['string11', 'string3', 'string1', 'string10', 'string100'])
[Out] ['string1', 'string3', 'string10', 'string11', 'string100']

这个模块也可以用在字典上,效果和 sorted 一样。

235

你其实没有把字符串转换成整数。或者说,你是转换了,但之后没有对结果做任何处理。你想要的应该是:

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

如果出于某种原因你需要保留字符串而不是整数(通常这样做不是个好主意,但可能是因为你需要保留前导零之类的),你可以使用一个 key 函数。sort 有一个叫 key 的参数,它是一个在比较每个元素之前会被调用的函数。这个 key 函数的返回值会被用来比较,而不是直接比较列表中的元素:

list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)
# or if you want to do it all in the same line
list1 = sorted([int(x) for x in list1]) 

撰写回答