我需要排序到以下列表:
b = ['0.10', '0.1', '0.11', '0.12', '0.2', '0.3']
...以便输出为:
['0.1', '0.2', '0.3', '0.10', '0.11', '0.12']
它们看起来像float
值,但这不是我想要的顺序 - 它们需要被视为版本号 - 即0.1不是0.10(第一个是零点1,第二个是零)点十)。当我使用float
作为密钥时,我得到了不同的顺序:
>>>b.sort(key=float)
>>>b
['0.10', '0.1', '0.11', '0.12', '0.2', '0.3']
我还想对以下列表进行排序:
['3.0.1', '3.0.10', '3.0.11', '3.0.12', '3.0.2', '3.0.3',
'3.0.4', '3.0.5', '3.0.6', '3.0.7', '3.0.8', '3.0.9',
'3.1.1', '3.1.10', '3.1.11', '3.1.12', '3.1.2', '3.1.3',
'3.1.4', '3.1.5', '3.1.6', '3.1.7', '3.1.8', '3.1.9']
按此顺序:
['3.0.1', '3.0.2', '3.0.3', '3.0.4', '3.0.5', '3.0.6',
'3.0.7', '3.0.8', '3.0.9', '3.0.10', '3.0.11', '3.0.12',
'3.1.1', '3.1.2', '3.1.3', '3.1.4', '3.1.5', '3.1.6',
'3.1.7', '3.1.8', '3.1.9', '3.1.10', '3.1.11', '3.1.12']
答案 0 :(得分:7)
您已尝试将版本字符串列表排序为浮点值。浮点数0.3
大于0.10
,而不是更少;那显然不是你想要的。
这里的关键是版本字符串(以及IP地址和类似的东西)是以点分隔的整数,而不是浮点数,即使它们只有2个组件并且看起来像它们。*你想拉出那些整数并将它们排序为一系列数字。
要做到这一点,只需将字符串拆分为.
,将组件转换为整数,序列上的正常词典排序规则将处理其余的事项:
b.sort(key=lambda vers: [int(component) for component in vers.split('.')])
我能看到的唯一合适的东西是适合你想要的输出的是同一个想法的更通用版本,称为“自然排序”:它将每个数字运行视为一个整数,但每个其他字符都作为一个字符。 (例如,可以用"picture 9.jpg"
来"picture 10.jpg"
之前,就像在OS X的Finder中那样。)但是这需要更多的代码,所以我会更具体,更简单的猜测。
*有些项目实际上确实使用版本的浮点数...但当然它们永远不会转到版本3.10,因为它会小于3.9。相反,他们将使用例如3.99,然后3.999,依此类推。显然,对于真正属于浮点数的版本号,您希望使用float
作为键...