Python在lambda中自然排序

时间:2017-04-05 15:26:02

标签: python sorting

我想自然地排序,无论价值如何,我都发现代码在堆栈的其他地方执行此操作,我只是无法将其合并到我拥有的内容中,

这里有我所拥有的,它按索引排序主要子列表的顺序,唯一的' 0'在右上角,"子列表[1] [3]"

sheet_lists = [[1, ['', '', '', '0']],
           [2, ['', '', '', '1']],
           [3, ['', '', '', '2']],
           [4, ['', '', '', '3']],
           [5, ['', '', '', '4']],
           [6, ['', '', '', '5']],
           [7, ['', '', '', '6']],
           [8, ['', '', '', '7']],
           [9, ['', '', '', '8']],
           [10, ['', '', '', '9']],
           [11, ['', '', '', '10']],
           [12, ['', '', '', '11']],
           [13, ['', '', '', '12']],
           [14, ['', '', '', '13']],
           [15, ['', '', '', '14']],
           [16, ['', '', '', '15']],
           [17, ['', '', '', '16']],
           [18, ['', '', '', '17']]]

sheet_lists.sort(key=lambda lst: lst[1][3], reverse=True)

for l in sheet_lists:
    print (l)

它产生的输出是:

[10, ['', '', '', '9']]
[9, ['', '', '', '8']]
[8, ['', '', '', '7']]
[7, ['', '', '', '6']]
[6, ['', '', '', '5']]
[5, ['', '', '', '4']]
[4, ['', '', '', '3']]
[3, ['', '', '', '2']]
[18, ['', '', '', '17']]
[17, ['', '', '', '16']]
[16, ['', '', '', '15']]
[15, ['', '', '', '14']]
[14, ['', '', '', '13']]
[13, ['', '', '', '12']]
[12, ['', '', '', '11']]
[11, ['', '', '', '10']]
[2, ['', '', '', '1']]
[1, ['', '', '', '0']]

我期待:

[18, ['', '', '', '17']]
[17, ['', '', '', '16']]
[16, ['', '', '', '15']]
[15, ['', '', '', '14']]
[14, ['', '', '', '13']]
[13, ['', '', '', '12']]
[12, ['', '', '', '11']]
[11, ['', '', '', '10']]
[10, ['', '', '', '9']]
[9, ['', '', '', '8']]
[8, ['', '', '', '7']]
[7, ['', '', '', '6']]
[6, ['', '', '', '5']]
[5, ['', '', '', '4']]
[4, ['', '', '', '3']]
[3, ['', '', '', '2']]
[2, ['', '', '', '1']]
[1, ['', '', '', '0']]

正如您所看到的,这并没有正确排序。注意:我不想在排序之前简单地将值转换为INT或FLOAT。这是因为我预计包含字母或可能符号的值。

以下是自然排序单位清单的代码,信用证:https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/

import re
def sort_nicely( l ):
    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
    l.sort( key=alphanum_key )

我似乎无法将其合并到我的函数中,因为我必须调用lambda来选择列表中子列表中包含的值

2 个答案:

答案 0 :(得分:2)

您的关键功能是:

lambda lst: lst[1][3]

它需要对元素进行排序,并且知道其特定结构,从中提取一些位以用作排序键。您要使用的排序算法生成如下键:

alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]

它需要元素并以某种方式使用它以实现他们所描述的“自然”的方式。排序顺序。您可以轻松地将两者结合起来,因为在您的情况下,唯一的变化是您不想要元素本身,您需要它的一些子片段。而不是上面的key(相当于您的lst),而是key[1][3]。所以改变

alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key[1][3]) ]

现在,您感兴趣的子元素上会发生神奇的混乱,而sort_nicely会对您的特定结构起作用。

答案 1 :(得分:0)

*误读问题,留下子孙后代。

sheet_lists.sort(key=lambda lst: lst[1][3], reverse=True)

应该是

sheet_lists.sort(key=lambda lst: int(lst[1][3]), reverse=True)

字符串比较与整数

或者,您将数据规范化为不将整数存储为字符串。

sheet_lists = [[1, ['', '', '', 0]],
           [2, ['', '', '', 1]],
           [3, ['', '', '', 2]],
           [4, ['', '', '', 3]],
... etc