проверить, все ли элементы в списке идентичны - PullRequest
332 голосов
/ 02 октября 2010

Мне нужна следующая функция:

Вход : a list

Выход :

  • True если все элементы во входном списке оцениваются как равные друг другу, используя стандартный оператор равенства;
  • False в противном случае.

Производительность : конечно, я предпочитаю не брать на себя никаких ненужных накладных расходов.

Я чувствую, что это будетлучше всего:

  • перебрать список
  • сравнить соседние элементы
  • и AND все полученные логические значения

Но я не уверен, какой самый Pythonic способ сделать это.


РЕДАКТИРОВАТЬ :

Спасибо за все отличные ответы.Я оценил несколько, и было действительно трудно выбрать между решениями @KennyTM и @Ivo van der Wijk.

Отсутствие функции короткого замыкания сказывается только на длинном входе (более ~ 50 элементов), который имеетнеравные элементы в начале.Если это происходит достаточно часто (как часто зависит от длины списков), короткое замыкание не требуется.Кажется, лучший алгоритм короткого замыкания - @KennyTM checkEqual1.Однако за это стоит немалых затрат:

  • до 20x в почти идентичных списках производительности
  • до 2.5x в коротких списках производительности

Если длинные входы с ранними неравными элементами не происходят (или случаются достаточно редко), короткое замыкание не требуется.Тогда, безусловно, самым быстрым является решение @Ivo van der Wijk.

Ответы [ 25 ]

1 голос
/ 05 ноября 2018

Существует также рекурсивная опция на чистом Python:

 def checkEqual(lst):
    if len(lst)==2 :
        return lst[0]==lst[1]
    else:
        return lst[0]==lst[1] and checkEqual(lst[1:])

Однако по некоторым причинам он в некоторых случаях на два порядка медленнее, чем другие варианты. Исходя из менталитета языка Си, я ожидал, что это будет быстрее, но это не так!

Другим недостатком является то, что в Python есть предел рекурсии, который необходимо скорректировать в этом случае. Например, используя это .

1 голос
/ 15 февраля 2018

Измените список на набор.Тогда, если размер набора только 1, они должны быть одинаковыми.

if len(set(my_list)) == 1:
1 голос
/ 23 апреля 2012

Вы можете сделать:

reduce(and_, (x==yourList[0] for x in yourList), True)

Довольно досадно, что python заставляет вас импортировать операторы вроде operator.and_. Начиная с python3, вам также нужно будет импортировать functools.reduce.

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

1 голос
/ 21 ноября 2013
lambda lst: reduce(lambda a,b:(b,b==a[0] and a[1]), lst, (lst[0], True))[1]

Следующее закоротит короткое замыкание:

all(itertools.imap(lambda i:yourlist[i]==yourlist[i+1], xrange(len(yourlist)-1)))
0 голосов
/ 06 июля 2019

Вы можете использовать .nunique(), чтобы найти количество уникальных предметов в списке.

def identical_elements(list):
    series = pd.Series(list)
    if series.nunique() == 1: identical = True
    else:  identical = False
    return identical



identical_elements(['a', 'a'])
Out[427]: True

identical_elements(['a', 'b'])
Out[428]: False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...