【发布时间】:2014-04-11 01:57:48
【问题描述】:
一清二楚,是吗?我先举个例子……
my_list = [[4,'A4, A23, A3, A6', 'Description 1', 'Property 1'],
[4,'B3, B35, B10, B22', 'Description 2', 'Property 2'],
[6,'A1, A11, A10, A21, A2, A22', 'Description 3', 'Property 3']]
应该排序为:
>>>my_list:
[[6,'A1, A2, A10, A11, A21, A22', 'Description 3', 'Property 3']
[4,'A3, A4, A6, A23', 'Description 1', 'Property 1'],
[4,'B3, B10, B22, B35', 'Description 2', 'Property 2']]
所以,我首先需要对每个子列表第二个索引中的字符串进行自然排序,然后我需要根据子列表第二个索引中的字符串对所有列表进行自然排序。我整天都在用头撞墙,所以我发布任何我尝试过的代码可能只会把它引向错误的轨道。
也许我最初的示例案例不够稳健,但这是我根据@Ashwini 的代码得到的结果:
[[ 1, 'C1', 'DW-00232'],
[3, 'C11, C32, C46', 'DW-6546'],
[7, 'C16, C17, C18, C19, C20, C21, C25', 'DW-545'],
[5, 'C2, C3, C4, C5, C63', 'DW-7657'],
[1, 'C26', 'DW-0056'],
[2, 'C59, C60', 'DW-23424'],
[5, 'C6, C13, C24, C30, C64', 'DW-5345']]
我希望输出如下:
[[ 1, 'C1', 'DW-00232'],
[5, 'C2, C3, C4, C5, C63', 'DW-7657'],
[5, 'C6, C13, C24, C30, C64', 'DW-5345'],
[3, 'C11, C32, C46', 'DW-6546'],
[7, 'C16, C17, C18, C19, C20, C21, C25', 'DW-545'],
[1, 'C26', 'DW-0056'],
[2, 'C59, C60', 'DW-23424']]
球门柱一直在移动。 现在我需要考虑一些字母数字组合在括号中的情况。我需要在排序过程中忽略括号。
例子:
[[ 1, 'C1', 'DW-00232'],
[ 7, '(C21), C16, (C7), (C18), C19, C6, C65', 'DW-545'],
[ 5, ' C4, (C2), C3, C10, (C5)', 'DW-7657']]
排序如下:
[[ 1, 'C1', 'DW-00232'],
[ 5, '(C2), C3, C4, (C5), C10', 'DW-7657'],
[ 7, 'C6, (C7), C16, (C18), C19, (C21), C65', 'DW-545']]
好的,一旦我更仔细地检查了 Ashwini 的代码,上述案例是一个“简单”的解决方案。我将 translate 语句添加到他的自然排序函数中,基于他如何处理他的关键函数(因为这是按照我想要的方式排序,所以只有每行排序不正确),如下所示。
alphanum_key = (lambda key:
[convert(c.translate(None, punctuation + whitespace)) for c in re.split('([0-9]+)', key)])
【问题讨论】:
-
你的意思是指定第二个索引两次吗?
-
是的。第一次排序应该对每个子列表的第二个索引进行排序,然后第二个排序应该根据每个子列表的第二个索引对每个子列表进行排序。这还不清楚吗? (不是想居高临下,我只是不知道我说得有多清楚。)
-
啊,我明白了。想要对字符串进行排序是不寻常的,所以我没想到它;通常它会包含一个实际的列表,可以按预期排序。
-
确实...虽然继承了代码。
标签: python string list sorting natural-sort