You need to enable JavaScript to run this app. 如何获取列表中的最大值及其对应的索引
优惠活动
大模型
产品
解决方案
定价
更多

如何获取列表中的最大值及其对应的索引

解决方案

你当前的写法属于Haskell语法,如果要同时拿到最大值和对应的0基索引,可以按以下方式实现:

  • 核心思路:将原列表元素与对应的索引做配对,再按照元素值的大小规则找到最大值对应的配对,拆分出索引和值即可

标准库实现步骤

  • 导入需要的工具函数
    • Data.List模块提供的maximumBy:支持自定义比较逻辑的最大值查找函数
    • Data.Ord模块提供的comparing:快速构造按元组指定字段比较的规则
  • 用zip [0..] 原列表生成(索引, 元素值)格式的配对列表,针对示例列表会生成如下结构:

    [(0,4.3),(1,0.0),(2,6.2214),(3,9.1),(4,1.023990433763),(5,3.839)]

  • 对配对列表按第二项(元素值)执行最大值查找,拆分得到索引和最大值

完整可运行代码如下:

import Data.List (maximumBy)
import Data.Ord (comparing)

main = do
  let lst = [4.3,0.0,6.2214,9.1,1.023990433763,3.839]
      indexedList = zip [0..] lst
      (maxIndex, maxValue) = maximumBy (comparing snd) indexedList
  putStrLn $ "最大值:" ++ show maxValue
  putStrLn $ "对应索引:" ++ show maxIndex

运行输出为:

最大值:9.1
对应索引:3

常见误区:不要直接对zip [0..] lst的结果使用原生maximum函数。因为Haskell中元组的默认排序规则是先比较第一个元素,会直接取索引最大的配对(即列表最后一个元素),和按值找最大值的需求完全不符。

无额外依赖的手写实现

如果不想导入标准库模块,可以用递归方式手动遍历列表记录最大值和对应索引:

findMaxWithIndex :: Ord a => [a] -> (Int, a)
findMaxWithIndex (x:xs) = loop 1 0 x xs
  where
    loop _ maxIdx maxVal [] = (maxIdx, maxVal)
    loop curIdx maxIdx maxVal (next:rest)
      | next > maxVal = loop (curIdx + 1) curIdx next rest
      | otherwise = loop (curIdx + 1) maxIdx maxVal rest

调用方式:findMaxWithIndex [4.3,0.0,6.2214,9.1,1.023990433763,3.839],返回结果为(3,9.1),和预期完全一致。


内容的提问来源于stack exchange,提问作者randomdude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 15:45:03