回复:检查列表中是否出现整数的三元组 - 为什么我的代码为一个特定的测试用例给出了错误的答案?

Re: checking if triplets of integers occur in a list - why does my code give the wrong answer for one specific test case?

提问人:thumpy 提问时间:8/4/2023 最后编辑:Saysethumpy 更新时间:8/4/2023 访问量:66

问:

这是我被赋予的任务:

编写一个函数 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
python-3.x for 循环 if-statement 布尔

评论

0赞 JonSG 8/4/2023
而不是在列表的每次迭代中设置变量(即使您知道最终答案为 True,也可能将其重置为 False,如果测试为 True,则就在那里。has_tripletreturn Truereturn False
0赞 Sayse 8/4/2023
提示:测试用例将三元组作为列表中的最后一项。一旦你找到了三胞胎,你真的需要继续寻找三胞胎吗?

答:

1赞 Codist 8/4/2023 #1

原始问题中的缩进是有缺陷的。可能需要的是:

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

注意:

在此实现中,输入列表排序(升序)这一事实无关紧要

0赞 sahasrara62 8/4/2023 #2

由于您正在遍历列表,然后对每个元素使用,因此对于每个元素,此函数会计算每个值的整个数组中该数字的频率。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