Подтвердить что ты не робот

Python: определить, являются ли все элементы списка одним и тем же элементом

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

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

Чтобы сделать пример понятным, идеальная функция, называемая "all_same", будет работать следующим образом:

>>> property_list = ["one", "one", "one"]
>>> all_same(property_list)
True
>>> property_list = ["one", "one", "two"]
>>> all_same(property_list)
False

Я думал создать список уникальных элементов, а затем проверить, равна ли его длине 1, но я не уверен, что это самое элегантное решение там.

4b9b3361

Ответ 1

def all_same(items):
    return all(x == items[0] for x in items)

Пример:

>>> def all_same(items):
...     return all(x == items[0] for x in items)
...
>>> property_list = ["one", "one", "one"]
>>> all_same(property_list)
True
>>> property_list = ["one", "one", "two"]
>>> all_same(property_list)
False
>>> all_same([])
True

Ответ 2

Вы можете обмануть и использовать set:

def all_same( items ):
    return len( set( items ) ) == 1 #== len( items )

или вы можете использовать:

def all_same( items ):
    return all( map(lambda x: x == items[0], items ) )

или если вы имеете дело с итерируемым, а не списком:

def all_same( iterable ):
    it_copy = tee( iterable, 1 )
    return len( set( it_copy) ) == 1

Ответ 3

Я изначально интерпретировал, что вы проверяете идентичность ( "тот же элемент" ), но вы действительно проверяете равенство ( "одно значение" ). (Если вы тестировали личность, используйте вместо ==.)

def all_same(items):
  it = iter(items)
  for first in it:
    break
  else:
    return True  # empty case, note all([]) == True
  return all(x == first for x in it)

Вышеуказанное работает над любыми итерабельными, а не только списками, в противном случае вы могли бы использовать:

def all_same(L):
  return all(x == L[0] for x in L)

(Но, IMHO, вы также можете использовать общую версию - он отлично работает в списках.)

Ответ 4

Лучший способ сделать это - использовать наборы Python. Вам нужно определить all_same следующим образом:

def all_same(items):
    return len(set(items)) == 1

Тест:

>>> def all_same(items):
...     return len(set(items)) == 1
... 
>>> 
>>> property_list = ["one", "one", "one"]
>>> all_same(property_list)
True
>>> property_list = ["one", "one", "two"]
>>> all_same(property_list)
False
>>> 

Ответ 5

Это работает как для последовательностей, так и для итераций:

def all_same(items):
  it = iter(items)
  first = next(it, None)
  return all(x == first for x in it)

Ответ 6

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

def all_same(values):
    return values.count(values[0]) == len(values)

Ответ 7

Я создал этот фрагмент кода для этой же проблемы, подумав об этом. Я не совсем уверен, что он работает для каждого сценария.

def all_same(list):
    list[0]*len(list) == list