frozenset 至少 x 个元素

frozenset at least x elements

我目前有这段代码,它检查数组中的所有元素是否相同。如果是这样,return 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]

将 return 也是如此。因为有 5 次 1

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

在Python中是collections.Counter() object:

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

使用collections.Counter():

from collections import Counter

def all_equal(lst, count):
    return any(v >= count for v in Counter(lst).values())

使用 Counter 的简短回答:

from collections import Counter

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

Counter 是一个 "set" 计算其元素出现的次数。 Counter.keys() returns 元素,以及 Counter().values() returns 它们出现的次数。因此这 max 确保有一个元素出现超过 5 次。

您也可以边走边检查,如果任何值为 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

您可以使用计数器,但仅计算 defaultdict 一样快,有时甚至更快。