尝试以“特殊”方式对列表列表进行排序......我认为

问题描述 投票:0回答:1

我有一个列表,看起来像这样:

test_list = [['V1'],['V3','V2'],['V3'],['V2','V1'],['V1','V2']]

我希望它最终是这样的:

sorted_list = [['V1'],['V1','V2'],['V2','V1'],['V3','V2'],['V3']]

(请注意,“V”是我的用例的产物,但可能无关紧要,因为它们是常量前缀。)

列表可以有任意数量的元素,但始终只有 2 个单项列表(“末端”,始终包含列表中的最小和最大数字)。其余的都是介于两者之间的 2 项列表。这些需要按第一个元素排序。

看来我可以用“蛮力”来做到这一点,分离单项和双项列表,对两者进行排序,然后将双精度插入到单精度中,如下所示:

sorted_list = sorted([x for x in test_list if len(x) == 1])
doubles_list = sorted([x for x in test_list if len(x) == 2])
sorted_list[1:1] = doubles_list

但我一直认为有一种更优雅或更紧凑的方法可以做到这一点,但我只是看不到。 (而且我也已经研究它很长时间了,我无法判断这是否真的是一种稳健、防弹的方法。)

任何见解表示赞赏!

python sorting
1个回答
0
投票

这是一种基于解析数字的“自然排序”形式。

你可以这样做:

import re 

test_list = [['V1'],['V3','V2'],['V3'],['V2','V1'],['V1','V2']]

>>> sorted(test_list,key=lambda li: list(map(float, re.findall(r'\d+', ' '.join(li)))))

[['V1'], ['V1', 'V2'], ['V2', 'V1'], ['V3'], ['V3', 'V2']]
© www.soinside.com 2019 - 2024. All rights reserved.