Заморозить хотя бы х элементов

В настоящее время у меня есть этот код, он проверяет, все ли элементы в массиве одинаковы. Если это так, верните 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]

Вернет Правда так же хорошо. Так как есть 5 раз 1

4 ответа

Решение

Вместо того, чтобы использовать набор, используйте сумку или мультимножество типа. Мультимножество подсчитывает, сколько раз встречаются уникальные значения.

В 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

Использование 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 является "множеством" подсчетов его элементов. Counter.keys() возвращает элементы и Counter().values() возвращает номера их происшествий. Таким образом, это 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 так же быстро, а иногда и на самом деле быстрее.

Другие вопросы по тегам