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