Python编写子集判断程序出现KeyError,求处理元素不在频率表的方法
判断arr1是否为arr2子集的正确实现
你的代码存在两个核心问题:
- 逻辑方向颠倒:要验证arr1是arr2的子集,应该统计arr2的元素频率(需确认arr1的所有元素都能在arr2中找到足够数量),但你现在统计的是arr1的频率,逻辑完全反了。
- 未处理键不存在的情况:直接访问
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
相关产品推荐
相关产品推荐

