使用Python 3.x,我有一个字符串列表,我想对其执行自然的字母排序.
自然排序: Windows中文件的排序顺序.
例如,以下列表是自然排序的(我想要的):
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
Run Code Online (Sandbox Code Playgroud)
这是上面列表的"排序"版本(我有):
['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个行为与第一个类似的排序函数.
关注Sivaram Chintalapudi 提出的这个问题,我很感兴趣的是PostgreSQL中是否可以进行自然 - 或"人性化" - 对包含多位数字和单词/字母混合的字符串进行排序.没有固定的字符串中的单词和数字的模式,并且字符串中可能有多个多位数字.
我经常看到这个常见的地方是在Mac OS的Finder中,它自然地对包含混合数字和单词的文件名进行排序,在"3"之后放置"20",而不是在它之前.
所需的校对顺序将由算法产生,该算法将每个字符串拆分为字母数字边界的块,然后对每个部分进行排序,处理具有正常整理的字母块和用于整理目的的数字块作为整数.所以:
'AAA2fred'将成为('AAA',2,'fred')和'AAA10bob'将成为('AAA',10,'bob').然后可以根据需要对它们进行排序:
regress=# WITH dat AS ( VALUES ('AAA',2,'fred'), ('AAA',10,'bob') )
regress-# SELECT dat FROM dat ORDER BY dat;
dat
--------------
(AAA,2,fred)
(AAA,10,bob)
(2 rows)
Run Code Online (Sandbox Code Playgroud)
与通常的字符串排序规则相比:
regress=# WITH dat AS ( VALUES ('AAA2fred'), ('AAA10bob') )
regress-# SELECT dat FROM dat ORDER BY dat;
dat
------------
(AAA10bob)
(AAA2fred)
(2 rows)
Run Code Online (Sandbox Code Playgroud)
但是,记录比较方法没有概括,因为Pg不会比较ROW(..)构造或不等数量条目的记录.
给定此SQLFiddle中的示例数据,默认的en_AU.UTF …