我有以下已排序的元组列表,其中"已排序"在python:
L = [("1","blaabal"),
("1.2","bbalab"),
("10","ejej"),
("11.1","aaua"),
("12.1","ehjej"),
("12.2 (c)", "ekeke"),
("12.2 (d)", "qwerty"),
("2.1","baala"),
("3","yuio"),
("4","poku"),
("5.2","qsdfg")]
我的问题就像你可以注意到的那样,起初很好,尽管在" 12.2(d)"列表重新开始于" 2.1",我不知道如何解决这个问题。
谢谢
答案 0 :(得分:5)
有一个专门为您的案例制作的包natsort
:
>>> from natsort import natsorted
>>> L = [('1', 'blaabal'), ('4', 'poku'), ('12.2 (c)', 'ekeke'), ('12.1', 'ehjej')]
>>> natsorted(L)
[('1', 'blaabal'), ('4', 'poku'), ('12.1', 'ehjej'), ('12.2 (c)', 'ekeke')]
答案 1 :(得分:4)
由于每个元组中的第一个元素是一个字符串,因此Python正在执行词法排序,其中所有以'1'
开头的字符串都位于以'2'
开头的字符串之前。
要获得所需的排序,您需要将第一个条目视为float
而不是字符串。
我们可以使用sorted
以及自定义排序功能,该功能在排序之前将第一个条目转换为浮点数。当你可能有非唯一的第一个条目时,它还会保留第二个元组元素来处理大小写。
result = sorted(L, key = lambda x: (float(x[0].split()[0]), x[1]))
# [('1', 'blaabal'), ('1.2', 'bbalab'), ('2.1', 'baala'), ('3', 'yuio'), ('4', 'poku'), ('5.2', 'qsdfg'), ('10', 'ejej'), ('11.1', 'aaua'), ('12.1', 'ehjej'), ('12.2 (c)', 'ekeke'), ('12.2 (d)', 'qwerty')]
我必须添加一个x[0].split()[0]
,以便我们在空间中分割第一个元组元素并且只抓取第一个元素,因为有些元素具有'12.2 (d)'
等值,我们只想要{{1 }}
如果我们丢弃的第一个元素的第二部分很重要,那么你可以使用类似于下面的排序函数将第一个元素分解成碎片并将第一个元素转换为浮点数并将其余部分保留为字符串。
'12.2'
答案 2 :(得分:-3)
元组的第一个值是字符串,并按字典顺序排序。如果您希望它们保留字符串,请使用
进行排序sorted(l, key = lambda x: float(x[0]))