Si vous pouvez hacher vos variables (et, euh, vos variables ont un sens __hash__
), utilisez un ensemble.
def check_all_unique(li):
unique = set()
for i in li:
if i in unique: return False #hey I've seen you before...
unique.add(i)
return True #nope, saw no one twice.
O (n) pire cas. (Et oui, je suis conscient que vous pouvez également len(li) == len(set(li))
, mais cette variante retourne au début si une correspondance est trouvée)
Si vous ne pouvez pas vos valeurs de hachage (pour une raison quelconque), mais peut les comparer de façon significative:
def check_all_unique(li):
li.sort()
for i in range(1,len(li)):
if li[i-1] == li[i]: return False
return True
O (nlogn), parce que le tri. Fondamentalement, trier tout, et comparer par paire. Si deux choses sont égales, elles auraient dû être triées les unes à côté des autres. (Si, pour une raison quelconque, votre __cmp__
ne règle pas les choses qui sont les mêmes à côté de l'autre, 1. Wut et 2. S'il vous plaît passez à la méthode suivante.)
Et si ne
est le seul opérateur que vous avez ....
import operator
import itertools
li = #a list containing all the variables I must check
if all(operator.ne(*i) for i in itertools.combinations(li,2)):
#do something
J'utilise essentiellement itertools.combinations
pour apparier toutes les variables, puis en utilisant operator.ne
pour vérifier non equalness. Cela a une complexité temporelle pire du cas de O (n^2), bien qu'il devrait toujours court-circuiter (parce que les générateurs, et all
est paresseux). Si vous êtes absolument sûr que ne
et eq
sont opposés, vous pouvez utiliser operator.eq
et any
à la place.
Addendum: Vincent a écrit une beaucoup version plus lisible de la variante itertools
qui ressemble à
import itertools
lst = #a list containing all the variables I must check
if all(a!=b for a,b in itertools.combinations(lst,2)):
#do something
Addendum 2: Euh, pour les ensembles de données suffisamment grandes, la variante de tri devrait peut-être utiliser heapq
. Toujours serait O (nlogn) le pire des cas, mais O (n) le meilleur des cas. Ce serait quelque chose comme
import heapq
def check_all_unique(li):
heapq.heapify(li) #O(n), compared to sorting's O(nlogn)
prev = heapq.heappop(li)
for _ in range(len(li)): #O(n)
current = heapq.heappop(li) #O(logn)
if current == prev: return False
prev = current
return True
Que faites-vous réellement qui vous oblige à vérifier que de nombreuses conditions? Cela a une odeur de code. – Makoto
Je suis d'accord avec @Makoto. Qu'est-ce qui vous oblige à faire cela? Cela ressemble à un problème de xy. – Carcigenicate
Il s'agit d'un programme qui vérifie les votes de 5 candidats, il compte une liste qui a des votes de préférence de 1 à 5, celui avec le plus grand nombre de votes '1' est gagnant mais si un ou plusieurs ont le même de «1» votes, il choisit ensuite le gagnant sur la base des votes de préférence «2» et s'ils sont identiques, il fait «3» votes et ainsi de suite. C'est un peu long, mais c'était l'ensemble des tâches et j'ai tout séparé de cette partie du code. –