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

Python编写子集判断程序出现KeyError,求处理元素不在频率表的方法

判断arr1是否为arr2子集的正确实现

你的代码存在两个核心问题:

  1. 逻辑方向颠倒:要验证arr1是arr2的子集,应该统计arr2的元素频率(需确认arr1的所有元素都能在arr2中找到足够数量),但你现在统计的是arr1的频率,逻辑完全反了。
  2. 未处理键不存在的情况:直接访问frequency[arr2[i]]时,如果元素不在字典中会触发KeyError。

最佳处理方式

针对元素不在频率表中的情况,核心是先做存在性检查:

  • 遍历arr1的元素时,如果该元素不在arr2的频率字典中,说明arr1包含arr2没有的元素,直接返回False。
  • 如果元素存在,则检查剩余频率是否大于0,若数量不足也返回False。

修正后的代码

def isSubset(arr1, arr2):
    # 统计arr2的元素频率(目标集合)
    frequency = {}
    for elem in arr2:
        if elem in frequency:
            frequency[elem] += 1
        else:
            frequency[elem] = 1
    
    # 遍历arr1,验证每个元素都能在arr2中找到足够数量
    for elem in arr1:
        # 先检查元素是否存在于频率表中
        if elem not in frequency:
            return False
        # 再检查剩余数量是否足够
        if frequency[elem] > 0:
            frequency[elem] -= 1
        else:
            return False
    
    return True

# 测试用例
print(isSubset(['a'], ['b']))  # 输出 False,符合预期
print(isSubset(['a', 'a'], ['a', 'b', 'a']))  # 输出 True
print(isSubset(['a', 'c'], ['a', 'b']))  # 输出 False

简化实现(可选)

可以用dict.get()方法简化频率统计,避免显式的存在性判断:

def isSubset(arr1, arr2):
    frequency = {}
    for elem in arr2:
        frequency[elem] = frequency.get(elem, 0) + 1
    
    for elem in arr1:
        count = frequency.get(elem, 0)
        if count == 0:
            return False
        frequency[elem] = count - 1
    
    return True

这个版本中,frequency.get(elem, 0)会在元素不存在时返回0,自然就能处理元素不在频率表的情况——如果返回0,直接判定为不是子集。

内容的提问来源于stack exchange,提问作者test tes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:35:26