提问人:thumpy 提问时间:8/4/2023 最后编辑:Saysethumpy 更新时间:8/4/2023 访问量:66
回复:检查列表中是否出现整数的三元组 - 为什么我的代码为一个特定的测试用例给出了错误的答案?
Re: checking if triplets of integers occur in a list - why does my code give the wrong answer for one specific test case?
问:
这是我被赋予的任务:
编写一个函数 find_if_triplet(),它接收单个参数 my_list,一个整数列表,值按升序排列。
该函数返回一个布尔值 has_triplet,如果列表my_list的元素至少出现三次,则该值设置为 True。否则返回 False。
例如 如果 my_list = [1,1,1],则函数应返回 has_triplet = True,如果 my_list = [1,2,3,3,3],则函数应返回 has_triplet = True,如果 my_list = [1,2,2,2,2,3],则函数应返回 has_triplet = True,如果 my_list = [1,2,2,3,4,4,5],则函数应返回 has_triplet = False。
我尝试使用 Python count() 函数来检查列表中的整数是否至少出现三次。虽然它适用于大多数测试用例,即当 my_list = [1,1,1] 或 [1,2,3,3,3] 或 [1,2,2,3,4,4,5] 时,当 my_list =[1,2,2,2,2,3] 时,它不起作用。布尔值不是返回 True(有三元组),而是错误地返回 False。为什么会这样?
def find_if_triplet(my_list):
for i in my_list:
instances = my_list.count(i)
if instances >= 3:
has_triplet = True
else:
has_triplet = False
return has_triplet
答:
原始问题中的缩进是有缺陷的。可能需要的是:
from collections import Counter
def find_if_triplet(my_list: list[int]) -> bool:
if len(my_list) > 2:
for x in set(my_list):
if my_list.count(x) > 2:
return True
return False
# if you prefer Counter to do all the work for you then:
def find_if_triplet2(my_list: list[int]) -> bool:
if len(my_list) > 2:
_, n = Counter(my_list).most_common()[0]
return n > 2
return False
lst = [1,2,2,2,2,3]
print(find_if_triplet(lst))
print(find_if_triplet2(lst))
输出:
True
True
注意:
在此实现中,输入列表排序(升序)这一事实无关紧要
由于您正在遍历列表,然后对每个元素使用,因此对于每个元素,此函数会计算每个值的整个数组中该数字的频率。list.count
同样在您的代码中,如果对于任何值,假设每个值has_triplet值更改为(对于每个索引),因为您将 has_triplet 的最终值作为回报,您将获得最终值,即最后一个数字是否has_triplet True 或仅 True。[1,2,2,2,2,4]
[False, True, True, True, True, False]
因此,要解决此问题,您可以使用 Counter Fujnction 或将计数器功能设为
def find_if_triplet(array):
has_triplet = False
freq = {}
for num in array:
if num not in freq:
freq[num] = 0
freq[num] += 1
if freq[num] >= 3:
has_triplet = True
break # once found triplet stop search further and end the looping
return has_triplet
上一个:我的井字游戏有问题
下一个:有没有办法让我的代码更有效率
评论
has_triplet
return True
return False