如何获取列表中唯一元素对应的最邻近索引值?
解决方法
先理清楚逻辑
第一步得把每个元素对应的所有索引归到一起,比如A对应[0,15,20],B对应[2,16],C对应[7,17]。然后对每个元素的索引,找出哪个索引离其他元素的索引最近——也就是这个索引和其他元素的所有索引之间的最小距离是最小的,这个索引就是我们要的。
代码实现(Python)
from collections import defaultdict items = ['A', 'A', 'A', 'B', 'B', 'C', 'C'] index = [0, 15, 20, 2, 16, 7, 17] # 按元素分组,把每个元素对应的索引都攒起来 element_indices = defaultdict(list) for item, idx in zip(items, index): element_indices[item].append(idx) all_indices = set(index) result = {} for elem, indices in element_indices.items(): # 只保留其他元素的索引,排除当前元素自己的 other_indices = all_indices - set(indices) best_idx = None smallest_min_dist = float('inf') for idx in indices: # 计算当前索引到其他元素索引的最近距离 current_min_dist = min(abs(idx - other_idx) for other_idx in other_indices) if current_min_dist < smallest_min_dist: smallest_min_dist = current_min_dist best_idx = idx result[elem] = best_idx # 按A、B、C的顺序输出结果 print([result['A'], result['B'], result['C']]) # 输出: [15, 16, 17]
为啥这么写?
- 分组的时候用
defaultdict最方便,不用手动判断元素是否已经在字典里。 - 计算距离的时候,只看当前元素之外的索引,这样能准确找到“离其他元素最近”的那个索引:
- A的三个索引里,15离B的16最近(距离1),比0离B的2(距离2)、20离C的17(距离3)都近,所以选15。
- B的两个索引里,16离A的15最近(距离1),比2离A的0(距离2)近,选16。
- C的两个索引里,17离B的16最近(距离1),比7离B的2(距离5)近,选17。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

