如何确定某个值在列表中是否出现两次以上?

时间:2018-07-05 19:46:31

标签: python algorithm list count

我有一个列表,想确定是否有任何值出现两次以上。 我曾尝试使用集合和计数器,但无法将它们评估为单个True或False值。

myArray=[1,1,1,1,1,1,1,1,2]

我希望它返回: True,如果任何值出现的次数超过两次

我们非常感谢您的帮助,如果解决方案很快,它将为您提供真正的帮助。我正在检查成千上万的列表。我是编程新手,这是我的第一篇文章。

编辑:我的尝试,也是stackoverflow UI的新手

import collections

arr= [1,2,3,5,6]

Counter(arr)

返回:Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 1})

4 个答案:

答案 0 :(得分:4)

您可以为此使用collections.Counter

from collections import Counter
print any(count > 2 for count in Counter(myArray).itervalues())   # True

或者,如果您使用的是Python 3:

from collections import Counter
print(any(count > 2 for count in Counter(myArray).values()))   # True

答案 1 :(得分:1)

您始终可以构建值的直方图,并查看是否有任何条目大于两个。看起来可能像这样:

def is_more_than_twice(l):
   hist = {}
   for el in l:
       if el in hist:
           hist[el] += 1
       else:
           hist[el] = 1
       if hist[el] > 2:
           return True
   return False

您不需要迭代到列表的末尾,只需满足满足条件的元素el出现两次以上即可。

答案 2 :(得分:1)

这是使用collections.defaultdict的一种方法。就像@HoriaComan的方法一样,此解决方案不需要迭代整个列表。

myArray = [1,1,1,1,1,1,1,1,2]

from collections import defaultdict

def count_limit(L, k=2):
    d = defaultdict(int)
    for item in L:
        if d[item] == k:
            return True
        else:
            d[item] += 1
    return False

res = count_limit(myArray)  # False

性能基准化

为证明其影响,我们可以在较大的可迭代项上与Counter进行比较:

myArray = [1,1,1,1,1,1,1,1,2]*10000

from collections import defaultdict, Counter

def count_limit(L, k=2):
    d = defaultdict(int)
    for item in L:
        if d[item] == k:
            return True
        else:
            d[item] += 1
    return False

def count_limit_counter(myArray):
    return any(count > 2 for count in Counter(myArray).values())

%timeit count_limit(myArray)          # 1.52 µs per loop
%timeit count_limit_counter(myArray)  # 6.64 ms per loop

答案 3 :(得分:-1)

使用set()尝试

def OccursMoreThanTwice(myArray):
    for e in myArray:
        if myArray.count(e) > 2:
           return True
    return False

print OccursMoreThanTwice([1,1,1,1,1,1,1,1,2])