Мне нужна следующая функция:
Вход: a list
Выход:
-
True
, если все элементы в списке ввода оцениваются как равные друг другу с помощью стандартного оператора равенства; -
False
в противном случае.
Производительность: конечно, я предпочитаю не налагать лишних накладных расходов.
Я считаю, что было бы лучше:
- итерация по списку
- сравнить соседние элементы
- и
AND
все полученные булевы значения
Но я не уверен, какой самый питонический способ сделать это.
ИЗМЕНИТЬ
Спасибо за все замечательные ответы. Я оценил несколько, и было очень сложно выбирать между решениями @KennyTM и @Ivo van der Wijk.
Недостаток функции короткого замыкания болит только на длинном входе (более ~ 50 элементов), которые на ранних этапах имеют неравные элементы. Если это происходит достаточно часто (как часто зависит от того, как долго могут быть списки), требуется короткое замыкание. Лучшим алгоритмом короткого замыкания является @KennyTM checkEqual1
. Тем не менее, это требует значительных затрат:
- до 20x в производительности почти идентичные списки
- до 2,5x в производительности в коротких списках
Если длинные входы с ранними неравными элементами не происходят (или происходят достаточно редко), короткое замыкание не требуется. Тогда самым быстрым решением является @Ivo van der Wijk.