如何对字符串列表进行数字排序?

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

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()功能更多或更少的有用的东西。

360153 次浏览

您可以将函数传递给 key参数到 .sort方法。这样,系统将按键(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]

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

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

如果出于某种原因需要保留字符串而不是 int (这通常是个坏主意,但也许需要保留前导零或其他值) ,那么可以使用 钥匙函数。sort接受一个命名参数 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])

Python 的排序并不奇怪,只是这些代码:

for item in list1:
item=int(item)

不是做你认为它是什么-item没有被取代回到列表中,它只是扔掉。

无论如何,正确的解决方案是使用 key=int,正如其他人已经向您展示的那样。

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

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

最新的解决方案是正确的。您将解读为一个字符串,在这种情况下,顺序是1、100、104、2、21、2001001010、3等等。

您必须将输入转换为 int 类型:

已排序的字符串:

stringList = (1, 10, 2, 21, 3)

排序整型:

intList = (1, 2, 3, 10, 21)

要进行强制转换,只需将 stringList 放入 int (blahbrah)中。

再说一遍:

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

你亦可使用:

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

这与你在互联网上找到的其他东西非常相似,但也适用于像 [abc0.1, abc0.2, ...]这样的字母数字。

Seamus Campbell 的回答在 Python 2. x 上不起作用。

使用 lambda函数的 list1 = sorted(list1, key=lambda e: int(e))运行良好。

我昨天解决了同样的问题,发现了一个叫做 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的字典工作。

对数字列表进行排序的简单方法

numlists = ["5","50","7","51","87","97","53"]
results = list(map(int, numlists))
results.sort(reverse=False)
print(results)

如果你想使用字符串的数字更好地采取另一个列表,如我的代码所示,它将工作得很好。

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, 4, 10, 22, 23, 200]

试试这个,它会按降序对列表进行排序(在本例中不需要指定键) :

过程

listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC

产出:

 [48, 46, 25, 24, 22, 13, 8, -9, -15, -36]

真正的问题是排序是按字母数字排序的。所以如果你有一个列表 [’1’,’2’,’10’,’19’]运行 sort 你会得到[’1’,’10’。’19’,’2’]。即10在2之前,因为它看第一个字符并从那里开始排序。 Python 中的大多数方法似乎都是按照这个顺序返回的。例如,如果您有一个名为 abc 的目录,其中的文件标记为1.jpg、2.jpg 等,那么最多可以使用15.jpg File _ list = os.listdir (abc) file _ list 的顺序不是您所期望的,而是 File _ list = [’1.jpg’,’11.jpg’——-’15.jpg’,’2. jpg ] 重要的(大概这就是为什么你用数字命名它们)顺序不是你想象的那样。您可以通过使用“0”填充来避免这种情况。例如,如果您有一个列表 Alist = [’01’,’03’,’05’,’10’,’02’,’04’,’06] ,然后对它运行 sort,得到它的顺序 被通缉。Alist = [’01’,’02’etc ]因为第一个字符是0,在1之前。您需要的零填充量由列表中的最大值决定。例如,如果最大的是在100到1000之间,那么您需要将单个数字填充为001,002——-010,011——100,101等等。

可能不是最好的 Python,但是对于字符串列表,如 【‘1’、‘1.0’、‘2.0’、‘2’、‘1.1’、‘1.10’、‘1.11’、‘1.2’、‘7’、‘3’、‘5’】 “‘1’、‘1.0’、‘1.1’、‘1.2’、‘1.10’、‘1.11’、‘2’、‘2.0’、‘3’、‘5’、‘7’... ...”。

unsortedList = ['1','1.0','2.0','2', '1.1', '1.10', '1.11', '1.2','7','3','5']
sortedList = []
sortDict = {}
sortVal = []
#set zero correct (integer): examp: 1.000 will be 1 and breaks the order
zero = "000"
for i in sorted(unsortedList):
x = i.split(".")
if x[0] in sortDict:
if len(x) > 1:
sortVal.append(x[1])
else:
sortVal.append(zero)
sortDict[x[0]] = sorted(sortVal, key = int)
else:
sortVal = []
if len(x) > 1:
sortVal.append(x[1])
else:
sortVal.append(zero)
sortDict[x[0]] = sortVal
for key in sortDict:
for val in sortDict[key]:
if val == zero:
sortedList.append(str(key))
else:
sortedList.append(str(key) + "." + str(val))
print(sortedList)