2013-02-16 10 views

Odpowiedz

16

Najprostszym sposobem, aby to zrobić jest użycie the sum() built-in i generator expression:

def differences(a, b): 
    if len(a) != len(b): 
     raise ValueError("Lists of different length.") 
    return sum(i != j for i, j in zip(a, b)) 

Mamy pętla na listach razem używając zip(), a następnie porównać je. Jako True == 1 i False == 0, po prostu podsumowujemy to, aby uzyskać liczbę różnic. Innym rozwiązaniem byłoby wykorzystanie warunkowego część wyrażenia generatora:

sum(1 for i, j in zip(a, b) if i != j) 

naprawdę nie mogę powiedzieć, że czuję się bardziej czytelny niż inne, i wątpliwości będzie różnica wydajności.

+0

Wolę wyraźny '1 dla i ', zamiast niejawnego boolowskiego (powołując się na to, że jest to' int'), ale tak czy inaczej +1 (tak długo jest to wyraźne sprawdzanie długości) –

+0

@JonClements Zgadzam się, a jednak wtedy ważna część (porównanie) jest popychana do koniec wyrażenia, który wydaje się niezręczny. Zmieniam zdanie co do tego, co preferuję. –

-1

Można użyć sets. Rzuć zarówno do zestawu, a następnie znajdź różnicę między nimi. Na przykład:

>>> a = [1,3,5,7,9] 
>>> b = [1,2,5,7,2] 
>>> len(set(a) - set(b)) 
2 

To może być zawinięte w funkcji celu sprawdzenia różnic długości pierwszego.

+2

Nie będzie działać, jeśli występują powtarzające się elementy i nie uwzględnia kolejności. 'difference ([1, 3, 5, 7, 9], [9, 7, 5, 3, 1])' byłoby '0' w przeciwieństwie do' 4'. W przykładzie OP liczba "3" jest różna, mimo że istnieje na obu listach (to znaczy, pozycja ma znaczenie). To również ignoruje możliwość, że listy mają różną długość, jak wspomniano w pytaniu. –

+0

Ach tak, przegapiłem ostatnie 3 i użyłem 2 w moim przykładzie. Mój błąd! Wspomniałem, że funkcja może być używana do sprawdzania różnic, jak na przykładowy kod. – user2079098

1

rozwiązanie One-liner, który również produkuje błąd jeśli długość nie jest równa:

>>> sum(map(lambda x,y: bool(x-y),a,b)) 
2 

Teraz spróbuj wejście różnej długości:

>>> sum(map(lambda x,y: bool(x-y),[1,2],[1])) 
TypeError 

Jak to działa: bool (x, y) zwraca True, jeśli elementy są różne. Następnie mapujemy tę funkcję na 2 listy i otrzymujemy listę [False, True, False, True, False].
Jeśli stawiamy na mapie function() list o różnej długości, otrzymujemy TypeError

wreszcie sumę function() tego logiczną lista zawiera 2.

+0

Zauważ, że 'map()' i 'lambda' są generalnie wolniejsze i mniej czytelne niż wyrażenia comp/generator list, a to działa tylko dla liczb. –

+0

tak, są wolniejsze, ale kod jest znacznie krótszy, zależy to od tego, co jest potrzebne (przesadzam, potrzebuję prędkości, nie używam pythona :)). Bardziej czytelna jest bardzo subiektywna sprawa. Masz rację, że to nie działa w przypadku typów, w których operacja "-" nie jest zdefiniowana. –

+0

Dzięki za inne rozwiązanie.Preferuję rozwiązanie @ Lattyware, ponieważ osobiście uważam, że jest bardziej czytelny. Nie znam funkcji "lambda". Dzięki jego rozwiązaniu mogę zdefiniować komunikat o błędzie, więc wiem, jaki błąd dostałem. – LWZ

Powiązane problemy