Python中含美元格式键值对的列表排序问题求助
解决美元格式字符串的排序问题
哈哈,你猜得完全没错!问题根源就是那些带美元符号、逗号的字符串——Python对字符串排序是按字符的ASCII码顺序来比对的,完全不是你想要的数值大小逻辑,所以才会出现排序结果不符合预期的情况。
问题出在哪?
举个简单例子:你的列表里有'-$7.34'和'$0.14',作为字符串比较时,第一个字符'-'的ASCII码是45,'$'是36,所以'$'比'-'“小”,导致'$0.14'会排在'-$7.34'前面,但实际上数值上-7.34明显比0.14小,应该反过来才对。
正确的解决方案:先把美元字符串转成数值
我们需要先把带格式的美元字符串转换成浮点数,用这个数值作为排序的key。具体步骤是:
- 去掉字符串里的
$符号 - 去掉千分位的逗号(比如
$1,534.77里的逗号) - 将处理后的字符串转为
float类型
方法1:用lambda配合自定义转换逻辑
可以直接在lambda里完成转换,不用单独写函数:
items = [('30-Apr-2018', '$0.14'), ('30-Apr-2018', '$1,534.77'), ('29-Apr-2018', '-$7.34')] items_sorted = sorted(items, key=lambda x: float(x[1].replace('$', '').replace(',', ''))) print(items_sorted)
方法2:用itemgetter配合转换函数(和你原来的写法逻辑一致)
如果你习惯用operator.itemgetter,可以结合一个专门的转换函数:
from operator import itemgetter def parse_dollar_amount(s): # 处理美元字符串,返回对应的浮点数 cleaned = s.replace('$', '').replace(',', '') return float(cleaned) items = [('30-Apr-2018', '$0.14'), ('30-Apr-2018', '$1,534.77'), ('29-Apr-2018', '-$7.34')] items_sorted = sorted(items, key=lambda x: parse_dollar_amount(itemgetter(1)(x))) print(items_sorted)
最终排序结果
两种方法都会得到符合预期的数值排序结果:
[('29-Apr-2018', '-$7.34'), ('30-Apr-2018', '$0.14'), ('30-Apr-2018', '$1,534.77')]
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

