如何在Python中对节号列表进行排序?

Spa*_*ine 3 python sorting list

书籍部分通常编号为x.x.x,例如1.2.3.如何对节号列表进行排序?

将部分编号存储为字符串列表.

# a list of strings, section numbers
ls = ['1.1', '1.10', '1.2', '1.2.3', '1.2.1', '1.9']    

lists = sorted([s.split('.') for s in ls], key=lambda x:map(int, x))    
# [['1', '1'], ['1', '2'], ['1', '2', '1'], ['1', '2', '3'], ['1', '9'], ['1', '10']]

r = ['.'.join(sublist) for sublist in lists]    
#['1.1', '1.2', '1.2.1', '1.2.3', '1.9', '1.10']
Run Code Online (Sandbox Code Playgroud)

但是,我期待的结果是,

['1.1', '1.10', '1.2', '1.2.1', '1.2.3', '1.9']
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 7

使用自定义比较函数将字符串转换为整数的子列表.那些将正确排序没有问题.

In [4]: ls = ['1.1', '1.10', '1.2', '1.2.3', '1.2.1', '1.9']

In [5]: def section(s):
   ...:     return [int(_) for _ in s.split(".")]
   ...:

In [6]: sorted(ls, key=section)
Out[6]: ['1.1', '1.2', '1.2.1', '1.2.3', '1.9', '1.10']
Run Code Online (Sandbox Code Playgroud)


dhk*_*hke 5

根据您的评论,float这不是您需要的数据类型。就您而言,您有一个实际的章节/部分层次结构。

一种简单的(请记住,简单比复杂更好)方法是将节号表示为元组。由于元组是按字典顺序排序的,因此它们自然会按所需的顺序排序:

>>> lf = [(1, ), (1, 1), (1, 10), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (2, ), (1, 9)]
>>> sorted(lf)
[(1, ), (1, 1), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (2, )]
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,这也适用于不同长度的元组。

如果想将各部分保留为字符串,natsort也可以很好地处理点值:

>>> s = ['1', '1.1', '1.10', '1.2']
>>> natsort.natsorted(s)
['1', '1.1', '1.2', '1.10']
Run Code Online (Sandbox Code Playgroud)

您也可以定义自己的SectionNumber类,但这可能有点过分了。