代码之家  ›  专栏  ›  技术社区  ›  Sudhi

函数在python中获取给定数字列表中的一对数字

  •  0
  • Sudhi  · 技术社区  · 6 年前

    我正在编写一个函数,它试图返回一个整数,表示给定列表中匹配的数字对的数目。下面是代码。

    def testfunc(n, ar):
        count = []
        ar.sort()
        print(ar)
        if len(ar) == n:
            for i in range(len(ar)):
                for j in range(i+1, len(ar)):
                    if ar[i] == ar[j]:
                        count.append(1)
                        if ar[i+1] == ar[j+1]:
                            count.append(1)
                            break
        return len(count)
    

    当输入如下(测试用例1)时,它工作,但当输入为测试用例2时,它失败。

    测试用例1:

    n = 9
    ar = [10, 20, 20, 10, 10, 30, 50, 10, 20]
    

    测试用例2:

    n = 10
    ar = [1, 1, 3, 1, 2, 1, 3, 3, 3, 3]
    

    请告诉我犯了什么错误。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Patrick Haugh    6 年前

    如果对列表中每个项目的发生次数进行计数,得到项目到计数的映射,则项目的匹配对数是该项目的计数除以向下取整的2。我们可以使用 collections.Counter 计算项目和楼层划分 // 以获取每个项目的匹配对的数目。

    from collections import Counter
    
    def testfunc(arr):
        return sum(v//2 for v in Counter(arr).values())
    
    print(testfunc([10, 20, 20, 10, 10, 30, 50, 10, 20])) # 3
    print(testfunc([1, 1, 3, 1, 2, 1, 3, 3, 3, 3]))       # 4
    print(testfunc([2,2,3,3,5,8,5,9,8]))                  # 4
    

    不需要传递列表的长度,因为您可以通过调用 len(arr) .

        2
  •  1
  •   nlsdkd    6 年前

    你要检查数组的长度

    if arg[i+1] == arg[j+1]:
    试试这个,它对两种情况都有效。
    def testfunc(ar):
        ar.sort();
        count = i = 0
        while i + count < len(ar) - 1:
            if ar[count + i] == ar[count + i + 1]:
                count += 1
            i += 1
        return count