如何补全Python函数,判断列表是否距完美列表标准仅差一步?
修正基础代码的核心问题
原示例代码存在逻辑硬伤:直接用去重后的unique列表做频次统计,会让每个元素的计数固定为1,完全无法还原原始列表的真实出现次数。正确的统计逻辑需要遍历原始输入列表,逐次累加每个元素的出现频次。
明确判定边界
首先把规则拆成可落地的判断标准,避免歧义:
- 完美列表核心要求:必须存在3个互不相同的元素,分别满足:1个元素出现≥3次、1个元素(和前者不同)出现≥2次、1个元素(和前两者都不同)出现≥1次。由于只要存在3个不同元素,第三个元素的出现次数天然≥1,因此判断条件可以简化为:总不同元素数≥3 + 存在至少一个元素频次≥3 + 存在至少一个和前者不同的元素频次≥2。
- 仅需一步达标的定义:原列表本身不满足完美列表要求,且仅通过1次修改(新增1个任意元素,可以是列表已有元素,也可以是全新的未出现过的元素),就能让修改后的列表符合完美列表标准。
补全后的完整函数实现
def fun(some_list): # 正确统计每个元素的出现频次 freq_dict = {} for item in some_list: freq_dict[item] = freq_dict.get(item, 0) + 1 counts = list(freq_dict.values()) # 辅助判断:输入的频次列表是否满足完美列表要求 def is_perfect(cur_counts): # 条件1:不同元素总数至少3个 if len(cur_counts) < 3: return False # 找所有频次≥3的元素的索引 ge3_index_list = [idx for idx, c in enumerate(cur_counts) if c >= 3] if not ge3_index_list: return False # 遍历每个≥3的元素,检查排除该元素后,剩余元素中有没有≥2次的 for main_idx in ge3_index_list: has_other_ge2 = any( (cur_idx != main_idx) and (cur_counts[cur_idx] >= 2) for cur_idx in range(len(cur_counts)) ) if has_other_ge2: return True return False # 原列表已经是完美列表,需要0步达标,不符合判定要求 if is_perfect(counts): return False # 单步操作1:给任意已存在元素的频次+1 for idx in range(len(counts)): temp_counts = counts.copy() temp_counts[idx] += 1 if is_perfect(temp_counts): return True # 单步操作2:新增1个从未出现过的元素(频次为1) temp_counts = counts + [1] if is_perfect(temp_counts): return True # 所有单步操作都无法让列表达标 return False
场景校验
拿题目给出的示例和边界场景做验证:
- 测试
another_list = ['d','a','d','c','d','b']:原列表频次为[3,1,1,1],本身不满足完美要求(除了d的3次,剩下元素都是1次,没有≥2次的其他元素)。当给任意一个1次的元素加1后,频次变为[3,2,1,1],满足完美要求,因此函数返回True,和题目描述一致。 - 测试
my_list = ['d','a','d','c','d','c','b','a','b']:原列表频次为[3,2,2,2],已经满足完美要求,因此函数返回False。 - 测试边界场景
['a','a','a','b','b','b','c']:原列表频次为[3,3,1],满足“a≥3、b≥2、c≥1”的完美要求,因此函数返回False,避免了将多元素均≥3的场景漏判为不完美的问题。 - 测试边界场景
['a','a','a','b']:原列表只有2个不同元素,所有单步操作要么凑不齐3个不同元素,要么没有满足要求的频次组合,因此函数返回False。 - 测试场景
['a','a','b','b','c']:原列表频次为[2,2,1],没有元素达到3次,本身不满足完美要求。当给任意一个2次的元素加1达到3次后,就可以满足“≥3次、≥2次、≥1次”的组合要求,因此函数返回True。
内容的提问来源于stack exchange,提问作者plpm。
相关产品推荐
相关产品推荐

