You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找列表中目标值最靠近首尾的索引及相关实现疑问

解决方案

一、核心算法实现步骤

要实现需求,核心逻辑是先锁定所有目标值的位置,再从中筛选符合"最靠近首尾"规则的索引:

  1. 收集目标索引:遍历列表,记录所有等于目标值的元素索引。
  2. 边界判断:如果没有找到任何目标值,直接返回-1。
  3. 筛选最优索引:
    • 计算每个索引到列表开头的距离(即索引本身)和到结尾的距离(列表长度-1 - 索引)。
    • 优先选择距离首尾其中一端更近的索引;若两个索引到首尾的距离相等(如列表长度为奇数时的中间索引),选择更靠近开头的索引。

二、代码实现

基础版本(无lambda)

# 读取输入
target = input().strip()
num_list = input().split()

# 收集所有目标值的索引
indices = [i for i, val in enumerate(num_list) if val == target]

if not indices:
    print(-1)
else:
    first_idx = indices[0]
    last_idx = indices[-1]
    list_len = len(num_list)
    # 计算到首尾的距离
    dist_first = first_idx
    dist_last = (list_len - 1) - last_idx
    
    if dist_first < dist_last:
        print(first_idx)
    elif dist_last < dist_first:
        print(last_idx)
    else:
        # 距离相等时返回靠近开头的索引
        print(first_idx)

测试你的输入:

  • 目标值:0
  • 列表:4 1 5 5 6 2 3 1 6 1 4 3 0 6 0 4
    运行结果为14,完全符合预期。

使用lambda简化版本

lambda可以用来定义min函数的排序规则,一行完成最优索引的筛选,代码更紧凑:

target = input().strip()
num_list = input().split()

indices = [i for i, val in enumerate(num_list) if val == target]

if not indices:
    print(-1)
else:
    list_len = len(num_list)
    # lambda定义排序key:先比到首尾的最小距离,距离相等时比索引大小(选更小的)
    best_idx = min(indices, key=lambda x: (min(x, (list_len-1)-x), x))
    print(best_idx)

这个版本中,lambda返回元组(最小距离, 索引值):

  • 元组比较时优先看第一个元素(最小距离),值越小越优先;
  • 若第一个元素相等(到首尾距离相同),则比较第二个元素(索引值),值越小越优先(对应靠近开头的索引)。

三、关于lambda的必要性

lambda并非必须:

  • 基础版本用简单的条件判断就能实现需求,代码可读性更高,适合新手理解;
  • lambda版本更简洁,适合追求代码紧凑的场景,但对不熟悉lambda的开发者来说,可读性略有下降。
    你可以根据自己的代码风格和需求选择合适的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:01:06