3

我目前有这段代码,它检查数组中的所有元素是否相同。如果是这种情况,则返回 true

def all_equal(lst):
  """
  >>> all_equal([1,1,1,1,1,1,1])
  True
  >>> all_equal([1,2,3,1])
  False
  """
  return len(frozenset(lst)) == 1

但我要检查的是是否至少有 5 个相同的元素。

以便

[1,1,1,1,1,2,2]

也将返回 True 。因为有 5 次 1

4

4 回答 4

8

使用collections.Counter()

from collections import Counter

def all_equal(lst, count):
    return any(v >= count for v in Counter(lst).values())
于 2016-07-10T13:33:04.523 回答
7

不要使用集合,而是使用bagmultiset type。多重集计算唯一值出现的次数。

在 Python 中,这就是collections.Counter()对象

from collections import Counter

def all_equal(lst):
    bag = Counter(lst)
    if any(v >= 5 for v in bag.itervalues()):
        # an element occurred at least 5 times
        # (use bag.values() if using Python 3)
        return True
    return False
于 2016-07-10T13:31:59.307 回答
3

简短回答使用Counter

from collections import Counter

def some_equal(lst):
    return max(Counter(lst).values()) >= 5

Counter是一个“集合”计数其元素的出现。 Counter.keys()返回元素,并Counter().values()返回它们出现的次数。因此,这max确保有一个元素出现超过 5 次。

于 2016-07-10T13:33:48.950 回答
2

您还可以随时检查,如果任何值为 5,则在迭代时短路:

from collections import defaultdict

def five(it):
    d  = defaultdict(int)
    for ele in it:
        d[ele] += 1
        if d[ele] == 5:
            return True
    return False

您可以使用 Counter 但仅计算defaultdict的速度也一样快,有时实际上更快。

于 2016-07-10T13:46:14.713 回答