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

基于索引位置搜索的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:45:22