Python列表排序:将NaN、Inf移至末尾并反转有效数字
解决Python列表排序时nan/inf的处理问题
要实现有效数字降序、nan和inf放在末尾的需求,有两种简洁的实现方式:
方法一:拆分列表后拼接
先把列表分成有效数字和**非有效数字(nan/inf)**两部分,对有效数字降序排序后再拼接非有效部分:
import math n = [13, 4, 52, 3.1, float('nan'), float('inf'), 8.2] # 筛选出所有有限的有效数字(排除nan和inf) valid_numbers = [num for num in n if math.isfinite(num)] # 筛选出nan和inf non_valid = [num for num in n if not math.isfinite(num)] # 有效数字降序排序 + 拼接非有效部分 sorted_result = sorted(valid_numbers, reverse=True) + non_valid print(sorted_result) # 输出: [52, 13, 8.2, 4, 3.1, nan, inf]
math.isfinite()函数会返回True当且仅当输入是有限数(整数或普通浮点数,不是nan也不是inf),用它可以精准拆分列表。
方法二:使用sorted的key参数一次完成
不需要拆分列表,通过自定义排序key让有效数字排在前面并降序,nan/inf排在后面:
import math n = [13, 4, 52, 3.1, float('nan'), float('inf'), 8.2] sorted_result = sorted(n, key=lambda x: (not math.isfinite(x), -x) if math.isfinite(x) else (True, 0)) print(sorted_result) # 输出: [52, 13, 8.2, 4, 3.1, nan, inf]
key参数逻辑:
- 对于有效数字:key是
(False, -x),False确保它们排在所有True的前面(非有效数字的key第一个元素是True),-x让sorted默认的升序排序变成原数字的降序。 - 对于nan/inf:key是
(True, 0),True让它们排在末尾,第二个元素0不影响彼此的顺序(保持原列表中的相对顺序)。
内容的提问来源于stack exchange,提问作者James Risner
相关产品推荐
相关产品推荐

