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


127

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

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

我四处寻找与排序数字集相关的算法,但是我发现所有算法都涉及对字母数字集进行排序。

我知道这可能是个没有脑子的问题,但是google和我的教科书没有提供比该.sort()功能有用的功能。


9
请注意,您的for循环不会执行我认为您认为会执行的操作。
deinst 2010年

1
您从来没有更新list1。是什么让您认为list正在更新?
S.Lott

当提供list1 = ['1','1.10','1.11','1.1','1.2']作为输入时,也会出现类似的问题。而不是获得输出为['1','1.1','1.2','1.10','1.11'],我得到的是['1','1.1','1.10','1.11','1.2' ]
sathish '16

2
在python 3中,您可能要使用sorted(mylist)
Akin Hwan

Answers:


191

您实际上尚未将字符串转换为int。或更确切地说,您做了,但是随后您对结果什么也没做。您想要的是:

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

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

list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)

8
当我在2.7中尝试key = int时,我什么也没得到
KI4JGT

1
如果list元素存储为“整数”,则此方法有效,在浮点值的情况下应如何处理?例如,list1 = [
1,1.10,1.11,1.1,1.2

1
@ KI4JGT的sort方法修改列表并返回None。因此,代替list1 = list1.sort(key=int),使用just list1.sort(key=int)和list1将已经被排序。
Josiah Yoder

1
@ KI4JGT .sort()是一个就地运算符,它返回None,它对列表进行排序,您可能想使用sorted()
sherpya

39

你可以传递一个函数的key参数.sort方法。这样,系统将按key(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]

21

如果要使用sorted()功能:sorted(list1, key=int)

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


1
也可以使用套装!
MT

12

Python的排序并不奇怪。只是这段代码:

for item in list1:
   item=int(item)

没有按照您的想法去做- item不会被替换回列表中,只是被丢弃了。

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


12

您还可以使用:

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, ...]


8

Seamus Campbell的答案不适用于python2.x。
list1 = sorted(list1, key=lambda e: int(e))使用lambda功能效果很好。


8

昨天我也遇到了同样的问题,并找到了一个名为[natsort] [1]的模块,它可以解决您的问题。用:

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。[1]:https//pypi.org/project/natsort/


3

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

处理

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]

0

最新的解决方案是正确的。您正在以字符串形式读取解决方案,在这种情况下,顺序为1、100、104、2、21、20010010010、3,依此类推。

您必须将输入的内容转换为int:

排序的字符串:

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) 

1
类型错误:INT()参数必须是字符串或数字,而不是“元组”
塞斯提莫曼

另外,stringList中的字符串应带有引号。
Teepeemm,2015年

2
这是一种预测,“最新的解决方案是正确的”;)
GreenAsJade

0

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

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]

0

排序数字列表的简单方法

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

-1

真正的问题是按字母数字排序。因此,如果您有一个列表['1','2','10','19']并进行排序,则您会得到['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]。如果处理文件的顺序很重要(大概是您用数字命名它们的原因),那么该顺序就不是您认为的那样。您可以通过使用“零”填充来避免这种情况。例如,如果您有一个列表alist = ['01','03','05','10','02','04','06],然后对其进行排序,则会得到所需的顺序。alist = ['01','02'等],因为第一个字符是1之前的0。您需要填充的零个数由列表中的最大值确定。例如,如果最大的值介于100和1000,您需要填充001、002 --- 010,011--100、101等个位数。


-5
scores = ['91','89','87','86','85']
scores.sort()
print (scores)

这在python版本3中对我有用,尽管在版本2中没有。


3
尝试在那里用'11和'100'进行排序,这就是事情变得有趣的时候。
Penz's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.