80 votes

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

Dans certains de mon code j'ai mis une série d'objets dans une liste et je de construire une liste de leurs attributs, ce qui est une chaîne de caractères. J'ai besoin de déterminer si tous les éléments de cette deuxième liste ont exactement la même valeur, sans savoir à l'avance quelle valeur il est, et de renvoyer un booléen pour que je puisse faire des choses différentes dans mon code en fonction du résultat.

Je ne peux pas savoir les noms des propriétés à l'avance, c'est pourquoi je suis en train de faire quelque chose d'aussi générique que possible.

Pour créer l'exemple de claire, un idéal, une fonction, appelée "all_same" pourrait fonctionner comme ceci:

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

Je pensais faire une liste des éléments uniques et de vérifier ensuite si sa longueur est de 1, mais je ne suis pas sûr si c'est la solution la plus élégante là-bas.

148voto

FogleBird Points 23405
 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
 

55voto

wheaties Points 20917

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
 

5voto

tokland Points 29813

Cela fonctionne sur les séquences et les itérables (python> = 2.6 à cause de next intégré):

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

assert all_same([])
assert all_same([1])
assert all_same([1, 1])
assert all_same([None, None])
assert not all_same([1, 2])
assert not all_same([None, 42])
 

2voto

Jonas Klemming Points 1377

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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X