如何以数字方式对列表进行排序?

Bri*_*ian 114 python sorting

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

list1=["1","10","3","22","23","4","2","200"]
for item in list1:
    item=int(item)

list1.sort()
print list1
Run Code Online (Sandbox Code Playgroud)

给我:

['1', '10', '2', '200', '22', '23', '3', '4']
Run Code Online (Sandbox Code Playgroud)

我想要的是

['1','2','3','4','10','22','23','200']
Run Code Online (Sandbox Code Playgroud)

我查看了一些与排序数字集相关的算法,但我发现的算法都涉及排序字母数字集.

我知道这可能是一个毫无疑问的问题,但谷歌和我的教科书没有提供比.sort()功能更多或更少有用的东西.

Sea*_*ell 179

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

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

但是,python使你更容易:sort接受一个命名参数key,这是一个在比较之前在每个元素上调用的函数(但不修改列表)

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

  • 当我在2.7中尝试key = int时,我得到None (7认同)
  • @KI4JGT .sort() 是一个就地运算符,它返回 None,它对列表进行排序,您可能想要使用 sorted() (3认同)
  • @KI4JGT sort 方法修改列表并返回 None。因此,不要使用`list1 = list1.sort(key=int)`,而只使用`list1.sort(key=int)` 并且list1 已经被排序了。 (2认同)

ken*_*ytm 37

你可以传递一个函数的key参数.sort方法.有了这个,系统将按键(x)而不是x排序.

list1.sort(key=int)
Run Code Online (Sandbox Code Playgroud)

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

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

或列表理解

list1 = [int(x) for x in list1]
Run Code Online (Sandbox Code Playgroud)


sya*_*yam 17

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

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

  • 也适用于套装! (2认同)

Dan*_*man 12

Python的排序并不奇怪.只是这个代码:

for item in list1:
   item=int(item)
Run Code Online (Sandbox Code Playgroud)

没有做你认为的事情 - item没有被替换回列表,它被简单地扔掉了.

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


Jul*_*ian 9

您还可以使用:

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

  • 不幸的是,这只在字母和数字不以相同顺序出现时才有效;例如 `["abc123", "123abc"]`: `TypeError: 'float' 和 'str' 实例之间不支持 '<'`。解决方案:将隐藏函数替换为 `(float(text), "") if text.isdigit() else (float("inf"), text)`。它将始终返回一个 (float, str) 元组,因此比较始终有效。 (2认同)

Mar*_*olf 6

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


lrs*_*rsp 5

昨天我遇到了同样的问题,并找到了一个名为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']
Run Code Online (Sandbox Code Playgroud)

它也适用于字典sorted