проверить, все ли элементы в списке идентичны - 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 ]

4 голосов
/ 02 октября 2010

Сомневаюсь, что это «самый Pythonic», но что-то вроде:

>>> falseList = [1,2,3,4]
>>> trueList = [1, 1, 1]
>>> 
>>> def testList(list):
...   for item in list[1:]:
...     if item != list[0]:
...       return False
...   return True
... 
>>> testList(falseList)
False
>>> testList(trueList)
True

подойдет.

3 голосов
/ 03 марта 2016

Преобразуйте список в набор, а затем найдите количество элементов в наборе.Если результат равен 1, он имеет идентичные элементы, а если нет, то элементы в списке не идентичны.

3 голосов
/ 26 декабря 2016

Проверьте, все ли элементы равны первому.

np.allclose(array, array[0])

3 голосов
/ 21 октября 2015

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

reduce(lambda x, y: (x[1]==y, y), [2, 2, 2], (True, 2))

Возвращает трюпл, где первое значение является логическим, если все элементы одинаковы или нет.

3 голосов
/ 13 января 2012

Я бы сделал:

not any((x[i] != x[i+1] for i in range(0, len(x)-1)))

при any прекращает поиск итерируемого, как только находит условие True.

2 голосов
/ 14 декабря 2018

Или используйте diff метод numpy:

import numpy as np
def allthesame(l):
    return np.all(np.diff(l)==0)

И для вызова:

print(allthesame([1,1,1]))

Выход:

True
2 голосов
/ 02 октября 2010
>>> a = [1, 2, 3, 4, 5, 6]
>>> z = [(a[x], a[x+1]) for x in range(0, len(a)-1)]
>>> z
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
# Replacing it with the test
>>> z = [(a[x] == a[x+1]) for x in range(0, len(a)-1)]
>>> z
[False, False, False, False, False]
>>> if False in z : Print "All elements are not equal"
2 голосов
/ 13 апреля 2017

Можно использовать карту и лямбду

lst = [1,1,1,1,1,1,1,1,1]

print all(map(lambda x: x == lst[0], lst[1:]))
2 голосов
/ 10 января 2012
def allTheSame(i):
    j = itertools.groupby(i)
    for k in j: break
    for k in j: return False
    return True

Работает в Python 2.4, в котором нет "всего".

2 голосов
/ 12 января 2019

Или используйте метод сравнения numpy:

import numpy as np
def allthesame(l):
    return np.unique(l).shape[0]<=1

И для вызова:

print(allthesame([1,1,1]))

Выход:

True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...