如何在Python中正确排序包含浮点数字符串的列表?
解决字符串数字的自然排序问题
看起来你卡在了字符串形式数字的排序上——当前的排序是按字符串字典序来的,所以"102.3"会排在"11.0"前面,因为字符串比较时第二个字符'0'比'1'小,完全不符合我们预期的数值大小顺序。
你当前得到的错误排序结果
x1 = [['10.0', '[9.8-10.2]'], ['10.4', '[10.0-10.8]'], ['10.9', '[8.7-13.7]'], ['102.3', '[96.1-108.9]'], ['107.8', '[99.5-116.9]'], ['108.4', '[98.1-119.6]'], ['109.9', '[100.6-120.7]'], ['11.0', '[10.8-11.2]'], ['11.1', '[10.5-11.7]'], ['11.2', '[10.9-11.5]'], ['11.2', '[11.0-11.4]'], ['11.3', '[10.6-12.0]'], ['11.6', '[11.4-11.9]'], ['110.7', '[97.9-125.9]'], ['117.3', '[108.8-126.2]'], ['118.1', '[106.1-130.8]'], ['119.4', '[102.9-137.8]'], ['12.2', '[11.5-12.9]'], ['12.6', '[12.3-12.9]']]
你想要的正确顺序是:10.0, 10.4, 10.9, 11.0, 11.1, 102.3, 107.8, 108.4, 109.9...
你尝试过的代码
for x3 in ss: if x3[0].isdigit(): ss = float(x3[0]) x1 = sorted(ss, key = itemgetter(0)) print x1
甚至直接排序:
x1 = sorted(ss, key = itemgetter(0)) print x1
结果都和上面一致。
问题出在哪?
你之前的循环逻辑完全错了——遍历ss的时候,你把整个ss变量改成了单个float值(最后一个符合条件的元素的数值),而不是保留原列表并转换其中的元素。而且直接用itemgetter(0)作为key,排序时会按字符串的字典序比较,而不是数值大小。
正确的解决方案
只需要在sorted的key参数里,把每个子列表的第一个元素转换成float类型,让排序按照数值大小来就行:
from operator import itemgetter # 假设ss是你的原始输入列表 x1 = sorted(ss, key=lambda x: float(x[0])) print(x1)
如果你习惯用itemgetter,也可以这么写:
x1 = sorted(ss, key=lambda x: float(itemgetter(0)(x))) print(x1)
这样排序时,每个元素的排序依据是它第一个元素的数值大小,就能得到你想要的自然顺序了。
内容的提问来源于stack exchange,提问作者garg
相关产品推荐
相关产品推荐

