基于索引位置搜索的Python列表重复元素检测及代码问题解决
实现以元素值为索引标记的Python数组查重代码
原JavaScript逻辑的核心是:遍历数组时,将元素值作为标记容器的索引,若该索引已被标记则判定存在重复,否则标记该索引。你用Python字典时触发KeyError,是因为Python字典直接访问不存在的键会抛出异常,而JS数组访问不存在的索引仅返回undefined,二者行为不同。以下是几种贴合该逻辑的Python实现方案:
方案1:用字典get()方法规避KeyError
这是最直接适配原逻辑的方案,通过get()方法避免访问不存在的键时报错:
def has_duplicate(nums): marker = {} for num in nums: # 键不存在时默认返回False,不会触发异常 if marker.get(num): return True marker[num] = True return False
方案2:用defaultdict简化判断
借助collections模块的defaultdict,自动为不存在的键设置默认值False:
from collections import defaultdict def has_duplicate(nums): marker = defaultdict(bool) for num in nums: if marker[num]: return True marker[num] = True return False
方案3:用列表模拟JS数组逻辑(仅适用于元素范围可控场景)
如果数组元素都是非负整数且数值范围不大,可直接用列表作为标记容器,完全贴合JS的数组实现逻辑:
def has_duplicate(nums): if not nums: return False max_num = max(nums) # 初始化全为False的标记列表,覆盖所有可能的元素值索引 marker = [False] * (max_num + 1) for num in nums: if marker[num]: return True marker[num] = True return False
处理含负数的场景
如果数组包含负数,可通过偏移量将所有元素转为非负整数,再用列表标记:
def has_duplicate(nums): if not nums: return False min_num = min(nums) offset = -min_num # 偏移量,让最小元素变为0 max_adjusted = max(nums) + offset marker = [False] * (max_adjusted + 1) for num in nums: adjusted_num = num + offset if marker[adjusted_num]: return True marker[adjusted_num] = True return False
注意:此方案仅适合元素数值范围较小的场景,若元素值极大(如10^9),列表会占用过量内存,此时建议用字典方案。
内容的提问来源于stack exchange,提问作者Salmon Juice
相关产品推荐
相关产品推荐

