Chciałbym porównać wiele obiektów i powrotu True tylko wtedy, gdy wszystkie obiekty nie są równe między sobą. Próbowałem użyć poniższego kodu, ale nie działa. Jeśli OBJ1 i Obj3 są równe, a Obj2 i Obj3 nie są równe, wynik jest True.

obj1 != obj2 != obj3

Mam więcej niż 3 obiekty do porównania. Korzystanie z poniższego kodu jest poza pytaniami:

all([obj1 != obj2, obj1 != obj3, obj2 != obj3])
9
msampaio 30 lipiec 2012, 23:56

5 odpowiedzi

Najlepsza odpowiedź

Odpowiedź @Michael Hoffmana jest dobra, jeśli obiekty są zniesienia. Jeśli nie, możesz użyć ittools.4Binations:

>>> all(a != b for a, b in itertools.combinations(['a', 'b', 'c', 'd', 'a'], 2))
False
>>> all(a != b for a, b in itertools.combinations(['a', 'b', 'c', 'd'], 2))
True
21
BrenBarn 30 lipiec 2012, 20:01

Jeśli obiekty są znieczulenia, możesz zobaczyć, czy frozenset sekwencji obiektów ma taką samą długość jak sama sekwencja:

def all_different(objs):
    return len(frozenset(objs)) == len(objs)

Przykład:

>>> all_different([3, 4, 5])
True
>>> all_different([3, 4, 5, 3])
False
18
Michael Hoffman 31 lipiec 2012, 16:01

Jeśli obiekty są unteble, ale zamawiane (na przykład listy), możesz przekształcić roztwór itertools z O (n ^ 2) do O (N LOG N) Sortując:

def all_different(*objs):
    s = sorted(objs)
    return all(x != y for x, y in zip(s[:-1], s[1:]))

Oto pełna realizacja:

def all_different(*objs):
    try:
        return len(frozenset(objs)) == len(objs)
    except TypeError:
        try:
            s = sorted(objs)
            return all(x != y for x, y in zip(s[:-1], s[1:]))
        except TypeError:
            return all(x != y for x, y in itertools.combinations(objs, 2))
6
ecatmur 31 lipiec 2012, 13:31
from itertools import combinations
all(x != y for x, y in combinations(objs, 2))
4
ecatmur 30 lipiec 2012, 20:02

Możesz sprawdzić, czy wszystkie elementy na liście są unikalne, konwertując go do zestawu.

my_obs = [obj1, obj2, obj3]
all_not_equal = len(set(my_obs)) == len(my_obs)
3
Wilduck 30 lipiec 2012, 20:00