在Python中以表格(XX-YY)排序数字集

时间:2014-06-04 18:52:31

标签: python sorting natural-sort

我有一个包含

形式的值的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)

我无法轻易地将值更改为不包含破折号,因为我将数据从请求中提取到网站,并且需要使用原始形式的值来查询单个项目。

我确信那些有更多操作内置排序经验的人可以帮助我。

感谢。

4 个答案:

答案 0 :(得分:3)

您想要的排序输出只是字典排序。只需使用sorted / list.sort,无需任何自定义键或比较器。

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

如果前两个字符永远不会更改,那么您可以使用普通的sortsorted函数。

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< OLD ANSWER 4.0.0

您提到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作者。