我有一个列表,看起来像这样:
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
但我一直认为有一种更优雅或更紧凑的方法可以做到这一点,但我只是看不到。 (而且我也已经研究它很长时间了,我无法判断这是否真的是一种稳健、防弹的方法。)
任何见解表示赞赏!
这是一种基于解析数字的“自然排序”形式。
你可以这样做:
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']]