使用sorted函数按人口密度排序列表的列表时结果异常
解决sorted按人口密度排序不符合预期的问题
嘿,我一眼就看出问题出在哪了——你用来排序的人口密度是字符串类型,而不是数值类型!这会导致sorted函数按照字符串的字典序来比较,而不是我们想要的数值大小。
问题根源举个例子
比如你的列表里,'3.43'(加拿大)和'22.72'(巴西),作为字符串比较时,第一个字符'3'的ASCII码比'2'大,所以字符串排序会把加拿大排在巴西前面,但实际数值3.43远小于22.72,这就和预期的排序结果不符了。
修正方案
只需要在排序的key函数里,把人口密度的字符串转换成float类型,让sorted按照数值大小来排序就行。这里有两种简洁的写法:
写法1:直接用lambda表达式取元素并转换
from operator import itemgetter cnt_pop_within_range = [['China', '139.54'], ['United States of America', '32.19'], ['Brazil', '22.72'], ['Canada', '3.43'], ['Indonesia', '144.00'], ['Mexico', '65.32'], ['Egypt', '93.38'], ['France', '119.39'], ['Italy', '199.34'], ['South Africa', '44.98'], ['Colombia', '44.60']] # 修正后的排序逻辑 sorted_result = sorted(cnt_pop_within_range, key=lambda x: float(x[1]), reverse=True) print(sorted_result)
写法2:结合itemgetter转换(如果你习惯用itemgetter的话)
from operator import itemgetter cnt_pop_within_range = [['China', '139.54'], ['United States of America', '32.19'], ['Brazil', '22.72'], ['Canada', '3.43'], ['Indonesia', '144.00'], ['Mexico', '65.32'], ['Egypt', '93.38'], ['France', '119.39'], ['Italy', '199.34'], ['South Africa', '44.98'], ['Colombia', '44.60']] sorted_result = sorted(cnt_pop_within_range, key=lambda x: float(itemgetter(1)(x)), reverse=True) print(sorted_result)
正确的排序结果
运行修正后的代码,你会得到按人口密度从高到低的正确排序:
[['Italy', '199.34'], ['Indonesia', '144.00'], ['China', '139.54'], ['France', '119.39'], ['Egypt', '93.38'], ['Mexico', '65.32'], ['South Africa', '44.98'], ['Colombia', '44.60'], ['United States of America', '32.19'], ['Brazil', '22.72'], ['Canada', '3.43']]
小提醒
如果你的数据里有可能出现非数字的字符串(比如空值、文字描述),转换float时会报错,这时候可以先做数据校验或者添加异常处理哦。
内容的提问来源于stack exchange,提问作者PotatoMan
相关产品推荐
相关产品推荐

