在Python中以(XX-YY)的形式对数字集进行排序

在Python中以(XX-YY)的形式对数字集进行排序,python,sorting,natural-sort,Python,Sorting,Natural Sort,我有一个python列表,其中包含以下形式的值 CCXX-YY,其中CC是两个字母字符,对于所有值都相同,X是整数,YY也是整数 e、 g 进入 而不是 KA11-12 KA13-1 KA13-11 KA13-2 KA14-1 KA14-2 我尝试过的事情: natsort(思考的问题-是一个否定的符号) 延迟编辑:如果使用参数alg=ns.UNSIGNED,则natsort有效,如下所述 naturalsort(不适用于python 3?) 使用键值进行排序(我相信这是可以做到的,但我对py

我有一个python列表,其中包含以下形式的值

CCXX-YY,其中CC是两个字母字符,对于所有值都相同,X是整数,YY也是整数

e、 g

进入

而不是

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)

我无法轻松地将值更改为不包含破折号,因为我正在将数据从一个请求拉到一个网站,并且需要原始格式的值来查询单个项目

我相信有人有更多的经验,操纵内置排序可以帮助我


谢谢。

您想要的排序输出只是词典排序。只需使用/不使用任何自定义键或比较器。

如果您只考虑整数类:

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']
['KA11-11', 'KA11-12', 'KA13-1', 'KA13-2', 'KA14-1']
如果前两个字符永不更改,则可以使用普通的
排序
排序
函数

x = ['KA13-1', 'KA13-2', 'KA11-11', 'KA14-1', 'KA11-12']
sorted(x)
输出

['KC11-11', 'KA11-12', 'KB13-1', 'KA13-2', 'KA14-1']
['KA11-11', 'KA11-12', 'KA13-1', 'KA13-2', 'KA14-1']

真正的问题是你想把像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']

更新的答案

从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<4.0.0的旧答案

你提到,由于负面迹象,这对你不起作用。这是因为默认情况下“-”被解释为以下数字的一部分,但您可以使用“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
作者。

您的排序优先级是什么<代码>C先是
X
然后是
Y
?或者只考虑
X
然后
Y
进行排序?考虑到您的示例,字符串排序不够吗?此外,请指定值的含义。您的值是字符串、类、数组吗?@Pinna__be,这些值是字符串,与示例中的值类似。字符串排序是不够的,因为它会将KA13-11放在KA13-2之前,这不是期望的结果。@Cyber sort优先级是X然后Y,C对于所有项目都是相同的,因此它与排序无关,但我只是添加了它以更符合我的问题。除了我执行list.sort时,它做错了。它将遍历XX值,然后根据前2个字母字符对YY值进行排序。让我再试一次。@JoeBradish:您如何调用
sort
?如果我对
进行排序(“KA11-12 KA13-1 KA14-1 KA13-2 KA14-2.split())
,我会得到
['KA11-12'、'KA13-1'、'KA13-2'、'KA14-1'、'KA14-2']
。好的,这让我觉得是列表值中的某个东西在抛出排序,因为当我在列表上使用常规排序时,它在做类似于KA13-1KA14-1KA13-2KA14-2的事情,只是“KAXX-YY”是我的数据列表。你怎么知道OP想要lcg?给定的示例将按照lcg顺序和(string,int0,int1)进行排序,否?好的,下面是出现的问题。我刚刚有一个糟糕的例子(我会在这之后修复)。如果要将KA13-10添加到数据集中,它将显示在KA13-1之后,但在KA13-2之前。这就是我的问题所在,也是为什么我不能只订购LCG。太好了,这就解决了它。谢谢你的帮助。我想可能是钥匙和lambda的问题,只是想不出如何正确使用lambda。