Python如何按二维列表子列表的第二个浮点元素排序
问题根源
你当前的排序逻辑存在两个核心问题:
- 排序时直接用子列表中第二个元素的原始字符串作为排序依据,你误以为输出是按姓名排序,实际上是Python的字符串逐位对比逻辑在生效:字符串排序会按每个位置的字符Unicode编码值逐位比较,完全不反映字符串对应的实际数值大小。比如逐字符对比时,
'100.81'的第二位是字符0,编码值小于'12.4'的第二位字符2的编码值,所以'100.81'会排在'12.4'前面,最终得到的顺序和数值大小的预期完全不符。 - 数字字符串中存在用半角逗号代替小数点的写法(比如
1,13对应实际数值1.13),没有做格式转换的话,无法直接转成浮点数参与数值比较。
正确实现方式
只需要在排序时,把每个子列表的第二个元素转成对应的浮点数值,作为排序的key即可:
def sort_list(): # 排序前把带逗号的数字字符串替换成标准小数格式,转成浮点数作为排序依据 list_of_lists.sort(key=lambda x: float(x[1].replace(',', '.'))) print(list_of_lists) sort_list()
运行这段代码后,输出的结果和你预期的顺序完全一致:
[['Bo', '1,13'], ['Sara', '2,873'], ['Leon', '12.4'], ['Josh', '100.81'], ['Mina', '152,167']]
补充说明:如果你的数字字符串里同时存在千分位逗号和小数点(比如
1,234.56这种格式),就需要先把千分位的逗号去掉,再转成浮点数,不要用上面的直接替换逻辑。但结合你给出的样例数据,所有逗号都是代替小数点的用法,上面的替换逻辑完全适配你的场景。
内容的提问来源于stack exchange,提问作者Sphoebe
相关产品推荐
相关产品推荐

