Vérifier si tous les éléments d'une liste sont uniques
Quel est le meilleur moyen (le meilleur comme dans le mode conventionnel) de vérifier si tous les éléments d'une liste sont uniques?
Mon approche actuelle à l'aide d'un Counter
est:
>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
if values > 1:
# do something
Puis-je faire de mieux?
InformationsquelleAutor user225312 | 2011-03-11
Vous devez vous connecter pour publier un commentaire.
Pas le plus efficace, mais simple et concis:
Ne sera probablement pas faire beaucoup de différence pour des listes.
Ici est une de deux-liner qui va aussi faire un début de sortie:
Si les éléments de x ne sont pas hashable, alors vous allez avoir à recourir à l'aide d'une liste de
seen
:Une sortie précoce de la solution pourrait être
cependant pour les petits cas ou si en début de sortie n'est pas le cas alors je m'attends à
len(x) != len(set(x))
être la méthode la plus rapide.s = set()
...return not any(s.add(x) if x not in s else True for x in g)
len(x) != len(set(x))
être plus rapide que si en début de sortie n'est pas commun? Ne sont pas tant les opérations de O(len(x))? (oùx
est l'original de la liste)if x in s
à l'intérieur de la O(len(x)) pour la boucle.pour la vitesse:
Comment sur l'ajout de toutes les entrées d'un ensemble et de vérifier sa longueur?
len()
.Alternative à un
set
, vous pouvez utiliser undict
.Une autre approche entièrement, à l'aide de trier et grouper:
Il nécessite un tri, mais quitte sur la première répété valeur.
Ici est récursive de sortie précoce de la fonction:
Il est assez rapide pour moi, sans l'aide de bizarre(lent) conversions tout en
avoir une fonctionnelle approche de style.
H in T
fait une recherche linéaire, etT = L[1:]
des copies de tranches partie de la liste, de sorte que ce sera beaucoup plus lente que les autres solutions qui ont été proposées sur les grosses listes. Il est O(N^2) je pense que, bien que la plupart des autres sont en O(N) (fixe) ou O(N log N) (tri en fonction des solutions).Ici est un appel récursif à O(N2) version pour le fun:
Comment à ce sujet
En utilisant une approche similaire dans une Pandas dataframe de tester si le contenu d'une colonne contient des valeurs uniques:
Pour moi, c'est instantané sur une variable int dans un dateframe contenant plus d'un million de lignes.
Vous pouvez utiliser Yan de la syntaxe (len(x) > len(set(x))), mais au lieu de set(x), définir une fonction:
et ne len(x) > len(f5(x)). Ce sera rapide et est également afin de préserver.
Code, il est pris à partir de: http://www.peterbe.com/plog/uniqifiers-benchmark
x = range(1000000) + range(1000000)
, en cours d'exécution jeu(x) est plus rapide que la touche f5(x). L'ordre n'est pas une exigence dans la question, mais même en cours d'exécution sorted(set(x)) est encore plus rapide que la touche f5(x)Pour les débutants: