web-dev-qa-db-fra.com

Python: détermine si tous les éléments d'une liste sont identiques

Dans certains de mes codes, je place une série d'objets dans une liste et je construis une liste supplémentaire à partir de leurs attributs, qui est une chaîne. Je dois déterminer si tous les éléments de cette seconde liste ont exactement la même valeur, sans savoir au préalable quelle est cette valeur, et renvoyer un bool pour que je puisse faire différentes choses dans mon code en fonction du résultat.

Je ne peux pas connaître le nom des propriétés à l'avance, c'est pourquoi j'essaie de créer quelque chose d'aussi générique que possible.

Pour rendre l'exemple clair, une fonction idéale, appelée "all_same", fonctionnerait comme suit:

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

Je pensais dresser une liste d'éléments uniques, puis vérifier si sa longueur est égale à 1, mais je ne suis pas sûr que ce soit la solution la plus élégante.

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

Exemple:

>>> 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
113
FogleBird

Vous pouvez tricher et utiliser set:

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

ou vous pouvez utiliser:

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

ou si vous traitez avec une liste itérable au lieu d'une liste:

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

À l'origine, je vous ai interprété comme testant l'identité ("le même élément"), mais vous testez réellement l'égalité ("même valeur"). (Si vous testiez l'identité, utilisez is au lieu de ==.)

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)

Ce qui précède fonctionne sur n’importe quelle liste, sinon vous pouvez utiliser:

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

(Mais, à mon humble avis, vous pouvez aussi bien utiliser la version générale, elle fonctionne parfaitement sur les listes.)

9
Roger Pate

La meilleure façon de faire est d’utiliser des ensembles Python. Vous devez définir all_same comme ceci:

def all_same(items):
    return len(set(items)) < 2

Test:

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

Cela fonctionne aussi bien pour les séquences que pour les iterables:

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

Cela sera probablement plus rapide si vous savez que les valeurs sont dans une liste.

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

Après avoir réfléchi, j'ai créé cet extrait de code pour le même problème. Je ne sais pas si cela fonctionne pour tous les scénarios. 

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