如何对元素为A/B格式数字的数组进行排序?
解决方案
这事儿很简单,核心就是把每个分数字符串拆成分子和分母的数值,然后按照你需要的规则自定义排序逻辑就行。从你给的示例来看,排序规则应该是:先按分母从大到小排,分母相同的话再按分子从小到大排——要是我理解错了规则,你随时调整排序的方向就行。
Python 实现
用 sorted() 函数配合自定义 key 参数就能搞定,代码简洁直观:
arr = ["1/8", "2/8", "1/17", "4/17", "3/5", "1/2"] # 自定义排序键:先按分母降序(用负号反转默认升序),再按分子升序 sorted_arr = sorted(arr, key=lambda x: (-int(x.split('/')[1]), int(x.split('/')[0]))) print(sorted_arr) # 输出结果正好匹配你的需求:['1/17', '4/17', '1/8', '2/8', '3/5', '1/2']
解释一下:
x.split('/')把每个分数字符串拆成分子和分母的字符串数组;- 转成整数后,用
(-分母, 分子)作为排序键:因为sorted()默认是升序,负号会让大的分母对应的键更小,从而排在前面(实现分母降序);分母相同时,直接按分子升序排列。
JavaScript 实现
用数组的 sort() 方法,自定义比较函数即可:
const arr = ["1/8", "2/8", "1/17", "4/17", "3/5", "1/2"]; const sortedArr = arr.sort((a, b) => { // 解析两个分数的分子和分母 const [aNum, aDen] = a.split('/').map(Number); const [bNum, bDen] = b.split('/').map(Number); // 先比较分母:降序排列 if (aDen !== bDen) { return bDen - aDen; } // 分母相同则比较分子:升序排列 return aNum - bNum; }); console.log(sortedArr); // 输出结果:["1/17", "4/17", "1/8", "2/8", "3/5", "1/2"]
解释:
sort()方法的比较函数返回正数时,会交换两个元素的位置;返回负数则保持顺序;- 分母不同时,用
bDen - aDen让大的分母排在前面;分母相同时,用aNum - bNum让小的分子排在前面。
额外说明
如果你的实际需求是按分数的实际数值从小到大排序(比如 1/8 应该在 4/17 前面),只需要修改排序逻辑:
- Python 把
key改成:lambda x: int(x.split('/')[0]) / int(x.split('/')[1]) - JavaScript 把比较逻辑改成:
return (aNum / aDen) - (bNum / bDen)
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

