我有一个包含
形式的值的python列表CCXX-YY其中CC是2个字母字符,对于所有值都是相同的,X是整数,YY也是整数。
e.g。
KA13-1 KA13-2 KA14-2 KA14-1 KA11-12 KA13-11
到
KA11-12 KA13-1 KA13-2 KA13-11 KA14-1 KA14-2
而不是
KA11-12 KA13-1 KA13-11 KA13-2 KA14-1 KA14-2
我尝试过的事情:
natsort(思考问题 - 是一个负号)
延迟编辑:如果使用参数alg = ns.UNSIGNED,natsort可以工作,如下所示。
naturalsort(不能使用python 3吗?)
使用键值进行排序(我确定可以这样做,但我对python有点新,但我没有做到这一点)
我目前正在尝试的事情:
删除除了数字之外的所有额外字段并尝试基于此排序(这有一些问题,因为KA12-10将在KA14-1之后,因为它将是1210而不是141)
我无法轻易地将值更改为不包含破折号,因为我将数据从请求中提取到网站,并且需要使用原始形式的值来查询单个项目。
我确信那些有更多操作内置排序经验的人可以帮助我。
感谢。
答案 0 :(得分:3)
答案 1 :(得分:2)
ISTM真正的问题是你想要KA13-12
之类的东西。如果你希望它在KA13-2
之后出现,那么我认为你需要像
>>> seq = "KA13-1 KA13-2 KA14-2 KA14-1 KA11-12 KA13-12".split()
>>> seq.sort(key=lambda x: tuple(map(int, x[2:].split("-"))))
>>> seq
['KA11-12', 'KA13-1', 'KA13-2', 'KA13-12', 'KA14-1', 'KA14-2']
答案 2 :(得分:1)
如果您只想考虑排序的整数部分:
l = ['KB13-1', 'KA13-2', 'KC11-11', 'KA14-1', 'KA11-12']
sorted(l, key=lambda i: i[2:])
输出
['KC11-11', 'KA11-12', 'KB13-1', 'KA13-2', 'KA14-1']
如果前两个字符永远不会更改,那么您可以使用普通的sort
或sorted
函数。
x = ['KA13-1', 'KA13-2', 'KA11-11', 'KA14-1', 'KA11-12']
sorted(x)
输出
['KA11-11', 'KA11-12', 'KA13-1', 'KA13-2', 'KA14-1']
答案 3 :(得分:1)
更新的答案
从natsort版本4.0.0开始,这将为您提供开箱即用的功能,而无需使用和特殊选项。
>>> from natsort import natsorted
>>> natsorted('KA11-12 KA13-1 KA13-11 KA13-2 KA14-1 KA14-2'.split())
['KA11-12', 'KA13-1', 'KA13-2', 'KA13-11', 'KA14-1', 'KA14-2']
您提到natsort由于负面迹象而无效。这是因为默认情况下,“ - ”被解释为以下数字的一部分,但您可以使用“UNSIGNED”修饰符禁用它。
>>> from natsort import natsorted, ns
>>> natsorted('KA11-12 KA13-1 KA13-11 KA13-2 KA14-1 KA14-2'.split(), alg=ns.UNSIGNED)
['KA11-12', 'KA13-1', 'KA13-2', 'KA13-11', 'KA14-1', 'KA14-2']
使用versorted
也可以。
>>> from natsort import versorted
>>> versorted('KA11-12 KA13-1 KA13-11 KA13-2 KA14-1 KA14-2'.split())
['KA11-12', 'KA13-1', 'KA13-2', 'KA13-11', 'KA14-1', 'KA14-2']
完全披露,我是natsort
作者。