我想自然地排序,无论价值如何,我都发现代码在堆栈的其他地方执行此操作,我只是无法将其合并到我拥有的内容中,
这里有我所拥有的,它按索引排序主要子列表的顺序,唯一的' 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来选择列表中子列表中包含的值
答案 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