Если вы можете хэш-переменные (и, ну, ваши переменные имеют смысл __hash__
), используйте набор.
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) наихудший случай. (И да, я знаю, что вы также можете len(li) == len(set(li))
, но этот вариант возвращается рано, если совпадение найдено)
Если вы не можете хэш своих значений (по любой причине), но может быть осмысленно сравнить их:
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), потому что сортировка. В принципе, сортировать все и сравнивать попарно. Если две вещи равны, они должны были сортироваться рядом друг с другом. (Если по какой-либо причине ваш __cmp__
не сортирует вещи, которые являются одинаковыми рядом друг с другом, 1. wut и 2. пожалуйста, переходите к следующему методу.)
И если ne
является единственным оператором, у вас есть ....
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
Я в основном с помощью itertools.combinations
на пары все переменные, а затем с помощью operator.ne
для проверки не-equalness. Это имеет худшую временную сложность O (n^2), хотя она все еще должна быть короткой (потому что генераторы и all
ленивы). Если вы абсолютно уверены, что и eq
являются противоположностями, вы можете вместо этого использовать operator.eq
и any
.
Добавление: Vincent написал много более читаемой версии itertools
варианта, который выглядит как
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
Добавление 2: Мм, при достаточно большие наборы данных, сортировки вариант должен возможно использовать heapq
. Все еще был бы O (nlogn) худший случай, но O (n) лучший случай. Это было бы что-то вроде
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
Что вы на самом деле делаете, что требует от вас, чтобы проверить, что многие условия? У этого есть немного запаха кода. – Makoto
Я согласен с @ Макото. Что требует от вас этого? Это звучит как проблема xy. – Carcigenicate
Это программа, которая проверяет голоса 5 кандидатов, в основном подсчитывает список, который имеет предпочтение голосов от 1 до 5, тот, который имеет наибольшее количество голосов «1», выбирается победителем, но если один или несколько имеют ту же сумму голосов «1» затем выбирает победителя на основании «2» голосов предпочтений, и если они одинаковы, то это «3» голоса и так далее. Это немного длинный, но это была заданная задача, и я все это разбираюсь отдельно от этой части кода. –