我知道这听起来很简单,但我没有意识到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()功能更有用或更不有用的东西。
请注意,for循环并不像我怀疑的那样。
你没有及时更新list1。你为什么认为list正在更新?
当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']
在python 3中,您可能希望使用sorted(mylist)
实际上您还没有将字符串转换为整数。或者更确切地说,你做了,但是你没有对结果做任何事情。你想要的是:
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)
当我在2.7中尝试key=int时,我得不到任何结果。
@ki4jgt:它可以与python 3.3.2一起工作。
如果列表元素存储为"integer",那么在浮点值的情况下应该如何处理?例如,list1=[1,1.10,1.11,1.1,1.2]
@Sathish这应该有效:list1.sort(key=float)。
@ki4jgt sort方法修改列表并返回none。因此,不使用list1 = list1.sort(key=int),只使用list1.sort(key=int),列表1将被排序。
@ki4jgt.sort()是一个就地运算符,它返回none,它对列表进行排序,您可能需要使用sorted()。
您可以将函数传递给key参数给.sort方法。这样,系统将按键(X)而不是X进行排序。
list1.sort(key=int)
btw,要将列表永久转换为整数,请使用map函数
list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x
号
或列表理解
list1 = [int(x) for x in list1]
如果您想使用sorted()函数:sorted(list1, key=int)。
它返回一个新的排序列表。
Python的种类并不奇怪。只是这个代码:
for item in list1:
item=int(item)
。
并没有做你认为应该做的事情——item没有被替换回列表,只是被丢弃了。
不管怎样,正确的解决方案是使用key=int,正如其他人向您展示的那样。
您还可以使用:
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….]
希默斯·坎贝尔的回答对Python2.x不起作用。使用lambda函数的list1 = sorted(list1, key=lambda e: int(e))运行良好。
尝试此操作,它将按降序对列表进行排序(在这种情况下不需要指定键):
过程
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]
号
对数字列表进行排序的简单方法
numlists = [5,50,7,51,87,97,53]
numlists.sort(reverse=False)
print(numlists)
。
昨天我处理了同样的问题,发现了一个名为natsort的模块,它解决了问题。用途:
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)中即可。
再一次:
stringList = (1, 10, 2, 21, 3)
newList = int (stringList)
print newList
=> returns (1, 2, 3, 10, 21)
。
typeerror:int()参数必须是字符串或数字,而不是"tuple"
另外,字符串列表中的字符串应该有引号。
这是一个地狱般的预言:"最新的解决方案是正确的";)
python3排序功能:
if __name__== '__main__':
n = list(input())
print(n)
print(sorted(n))
号
如果您想使用数字串,最好使用另一个列表,如我的代码所示,它会很好地工作。
list1=["1","10","3","22","23","4","2","200"]
k=[]
for item in list1:
k.append(int(item))
k.sort()
print(k)
号
scores = ['91','89','87','86','85']
scores.sort()
print (scores)
这对我使用Python3版很有效,但在版本2中没有。
尝试在那里用"11"和"100"进行排序,这就是事情变得有趣的时候。