如何查找列表中目标值最靠近首尾的索引及相关实现疑问
解决方案
一、核心算法实现步骤
要实现需求,核心逻辑是先锁定所有目标值的位置,再从中筛选符合"最靠近首尾"规则的索引:
- 收集目标索引:遍历列表,记录所有等于目标值的元素索引。
- 边界判断:如果没有找到任何目标值,直接返回-1。
- 筛选最优索引:
- 计算每个索引到列表开头的距离(即索引本身)和到结尾的距离(
列表长度-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
相关产品推荐
相关产品推荐

