如何用数字排序字符串列表?

时间:2010-08-06 17:17:27

标签: python sorting

我知道这听起来微不足道,但我没有意识到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()功能更多或更少的用途。

15 个答案:

答案 0 :(得分:169)

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

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)

答案 1 :(得分:35)

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

list1.sort(key=int)

顺便说一句,要将列表永久转换为整数,请使用the map function

list1 = list(map(int, list1))   # you don't need to call list() in Python 2.x

或列表理解

list1 = [int(x) for x in list1]

答案 2 :(得分:16)

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

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

答案 3 :(得分:12)

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

for item in list1:
   item=int(item)

没有按照你的想法行事 - item没有被替换回列表,只是被扔掉了。

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

答案 4 :(得分:8)

您也可以使用:

 
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 ..]这样的字母数字

答案 5 :(得分:6)

Seamus Campbell 的回答对python2.x无效 使用list1 = sorted(list1, key=lambda e: int(e))功能的lambda效果很好。

答案 6 :(得分: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]

答案 7 :(得分:1)

最新的解决方案是对的。您正在以字符串形式阅读解决方案,在这种情况下,顺序为1,然后是100,然后是104,接着是2然后是21,然后是2001001010,3,依此类推。

您必须将输入作为int来输入:

排序字符串:

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

sort ints:

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) 

答案 8 :(得分:1)

我昨天遇到了同样的问题,发现了一个名为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']

答案 9 :(得分:1)

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

    numlists = [5,50,7,51,87,97,53]
    numlists.sort(reverse=False)
    print(numlists)

答案 10 :(得分:0)

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

list1=["1","10","3","22","23","4","2","200"]

k=[]

for item in list1:

         k.append(int(item))

k.sort()

print(k)

答案 11 :(得分:0)

Python3排序功能:

gsub('s([0-9]+)[a-z]+_.*$', '\\1', df$scan_id)
#[1] "8"  "8"  "9"  "10" "11" "12" "13" "14"

答案 12 :(得分:0)

可能不是最好的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)

答案 13 :(得分:-1)

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

这对我使用python版本3有用,虽然它在版本2中没有。

答案 14 :(得分:-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等个位数。