如何修复识别异类列表索引的函数?解决索引0时的失效问题
问题描述
给定一组列表,其中恰好存在一个与其他列表不同的异类列表。编写的Python代码如下,用于查找该异类列表的索引:
import numpy as np a = [[1, -2], [1, -2], [1,6], [1, -2], [1, -2]] def find_idx(lists): for i in range(len(lists)-1): diff = np.array(lists[0])-np.array(lists[i+1]) for k in diff: if k != 0: print(i+1) find_idx(a)
该函数在多数输入下运行正常,但当异类列表位于索引0时会返回错误结果。例如输入lists = [[1, 6],[1, -2], [1, -2], [1, -2], [1, -2]]时,函数会输出所有其他索引,唯独不返回正确的索引0。需要修改函数,使其能正确处理异类列表位于索引0的情况。
解决方案
原代码的核心问题是始终拿第一个元素和后续元素对比,没法判断第一个元素本身是不是异类。我们可以先确定多数元素的基准,再遍历所有列表找出和基准不同的那个,具体实现如下:
修改后的代码(通用版)
import numpy as np def find_idx(lists): # 取前三个元素统计,因为题目保证只有一个异类,前三个里必然有至少两个是多数派 candidates = lists[:3] # 把列表转成元组才能当字典的键,统计每个候选出现的次数 count = {} for lst in candidates: key = tuple(lst) count[key] = count.get(key, 0) + 1 # 找到出现次数最多的那个,作为多数派基准 base = max(count, key=count.get) # 遍历所有列表,找到和基准不同的那个的索引 for idx, lst in enumerate(lists): if tuple(lst) != base: print(idx) return # 题目说只有一个异类,找到就直接返回 # 测试两种场景 find_idx([[1, -2], [1, -2], [1,6], [1, -2], [1, -2]]) # 输出2 find_idx([[1, 6],[1, -2], [1, -2], [1, -2], [1, -2]]) # 输出0
简化版实现(利用numpy向量对比)
如果不想用统计的方式,也可以通过判断前几个元素的关系快速确定基准:
import numpy as np def find_idx(lists): # 先看第二个和第三个元素是否相同,相同则它们是多数派基准 if np.array_equal(lists[1], lists[2]): base = lists[1] # 检查第一个元素是不是异类 if not np.array_equal(lists[0], base): print(0) return # 第一个不是异类,遍历后续找不同的 for idx in range(1, len(lists)): if not np.array_equal(lists[idx], base): print(idx) return else: # 前三个里第二个和第三个不同,说明异类在0、1、2中,拿第四个元素当参照 if np.array_equal(lists[0], lists[3]): print(1) else: print(0) # 测试 find_idx([[1, 6],[1, -2], [1, -2], [1, -2], [1, -2]]) # 输出0
内容的提问来源于stack exchange,提问作者ramaa overseas
相关产品推荐
相关产品推荐

