W Pythonie, jaki jest najlepszy sposób obliczenia różnicy między dwiema listami?
przykład
A = [1,2,3,4]
B = [2,5]
A - B = [1,3,4]
B - A = [5]
Użyj, set
jeśli nie obchodzi Cię kolejność lub powtarzalność przedmiotów. Użyj rozumienia listy, jeśli:
>>> def diff(first, second):
second = set(second)
return [item for item in first if item not in second]
>>> diff(A, B)
[1, 3, 4]
>>> diff(B, A)
[5]
>>>
set(b)
aby upewnić się, że algorytm to O (nlogn) zamiast Theta (n ^ 2)set
do B jest nieszkodliwe, ale stosowanie go doA
i używanie wyniku zamiast oryginałuA
nie jest.Jeśli kolejność nie ma znaczenia, możesz po prostu obliczyć ustawioną różnicę:
źródło
Możesz zrobić
i
źródło
Jedna wkładka:
Lub:
źródło
Powyższe przykłady strywializowały problem obliczania różnic. Zakładając, że sortowanie lub usuwanie duplikatów zdecydowanie ułatwi obliczenie różnicy, ale jeśli twoje porównanie nie może pozwolić sobie na te założenia, będziesz potrzebować nietrywialnej implementacji algorytmu różnicowego. Zobacz difflib w standardowej bibliotece Pythona.
A - B = [[1, 3, 4]]
źródło
print
zmieniła się z poleceniem do funkcji, ireduce
,filter
imap
zostały uznane unpythonic. (I myślę, że Guido może mieć rację - też nie rozumiem, co toreduce
robi.)Python 2.7.3 (domyślnie, 27 lutego 2014, 19:58:35) - IPython 1.1.0 - timeit: (github gist)
Wyniki:
@ roman-bodnarchuk lista pojęć funkcja def diff (a, b) wydaje się być szybsza.
źródło
źródło
Chcesz użyć
set
zamiastlist
.źródło
Jeśli chcesz rekurencyjnie sięgnąć głęboko w elementy listy, napisałem pakiet dla pythona: https://github.com/erasmose/deepdiff
Instalacja
Zainstaluj z PyPi:
Jeśli jesteś Python3, musisz także zainstalować:
Przykładowe użycie
Ten sam obiekt zwraca pusty
Rodzaj przedmiotu zmienił się
Wartość przedmiotu uległa zmianie
Element został dodany i / lub usunięty
Różnica w strunach
Różnica w strunach 2
Zmiana typu
Lista różnic
Różnica w liście 2: Należy pamiętać, że NIE bierze ono pod uwagę kolejności
Lista zawierająca słownik:
źródło
najprostszy sposób,
użyj set (). różnica (set ())
odpowiedź to
set([1])
źródło
W przypadku listy słowników rozwiązanie pełnego zrozumienia listy działa, gdy
set
rozwiązanie się podnosiPrzypadek testowy
źródło
Prosty kod, który daje różnicę w przypadku wielu elementów, jeśli chcesz:
źródło
Gdy przyjrzymy się czasowi złożoności operatora, w najgorszym przypadku działa on z O (n). Nawet dla zestawów.
Porównując dwie tablice, będziemy mieli TimeComplexity O (n) w najlepszym przypadku i O (n ^ 2) w najgorszym przypadku.
Alternatywne (ale niestety bardziej złożone) rozwiązanie, które w najlepszym i najgorszym przypadku działa z O (n), to:
na przykład
źródło