Mam dwie listy w Pythonie, takie jak te:
temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']
Muszę utworzyć trzecią listę z elementami z pierwszej listy, których nie ma na drugiej. Z przykładu muszę uzyskać:
temp3 = ['Three', 'Four']
Czy są jakieś szybkie sposoby bez cykli i sprawdzania?
python
performance
list
set
set-difference
Max Frai
źródło
źródło
temp1 = ['One', 'One', 'One']
itemp2 = ['One']
chcesz['One', 'One']
wrócić[]
?Odpowiedzi:
Uważaj na to
gdzie możesz się spodziewać / chcesz, aby był równy
set([1, 3])
. Jeśli chceszset([1, 3])
jako odpowiedź, musisz użyćset([1, 2]).symmetric_difference(set([2, 3]))
.źródło
TypeError: 'str' object is not callable
kiedy wykonuję tę operacjęa = [1,2,2,2,3]
ib = [2]
Wszystkie istniejące rozwiązania oferują jedno lub drugie z:
Ale jak dotąd żadne rozwiązanie nie ma obu. Jeśli chcesz obu, spróbuj tego:
Test wydajności
Wyniki:
Metoda, którą przedstawiłem, a także zachowanie porządku jest również (nieco) szybsza niż odejmowanie zestawu, ponieważ nie wymaga budowy niepotrzebnego zestawu. Różnica wydajności byłaby bardziej zauważalna, gdyby pierwsza lista była znacznie dłuższa niż druga i jeśli mieszanie jest kosztowne. Oto drugi test, który to pokazuje:
Wyniki:
źródło
źródło
temp2
do zestawu przed pozwoliłoby to nieco bardziej wydajny.item not in temp2
iitem not in set(temp2)
zawsze zwróci te same wyniki, niezależnie od tego, czy są duplikaty, czy nietemp2
.Różnicę między dwiema listami (powiedzmy list1 i list2) można znaleźć za pomocą następującej prostej funkcji.
lub
Korzystając z powyższej funkcji, różnicę można znaleźć za pomocą
diff(temp2, temp1)
lubdiff(temp1, temp2)
. Oba dadzą wynik['Four', 'Three']
. Nie musisz się martwić o kolejność listy lub o to, która lista ma zostać podana jako pierwsza.Dokumentacja w Pythonie
źródło
Jeśli chcesz rekurencyjnie różnicę, napisałem pakiet dla Pythona: https://github.com/seperman/deepdiff
Instalacja
Zainstaluj z PyPi:
Przykładowe użycie
Importowanie
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 między listami 2:
Lista różnic ignoruje kolejność lub duplikaty: (z tymi samymi słownikami jak powyżej)
Lista zawierająca słownik:
Zestawy:
Nazwane krotki:
Niestandardowe obiekty:
Dodano atrybut obiektu:
źródło
Można to zrobić za pomocą operatora XOR w Pythonie.
źródło
najprostszy sposób,
użyj set (). różnica (set ())
odpowiedź to
set([1])
można wydrukować jako listę,
źródło
Jeśli naprawdę szukasz wydajności, użyj numpy!
Oto pełny notatnik jako gist na githubie z porównaniem list, numpy i pand.
https://gist.github.com/denfromufa/2821ff59b02e9482be15d27f2bbd4451
źródło
rzucę się, ponieważ żadne z obecnych rozwiązań nie daje krotki:
alternatywnie:
Podobnie jak inne nie-krotki dające odpowiedzi w tym kierunku, zachowuje porządek
źródło
Chciałem coś, co będzie trwać dwa wykazy i może robić to, co
diff
siębash
robi. Ponieważ to pytanie pojawia się jako pierwsze, gdy wyszukujesz „python diff two list” i nie jest zbyt szczegółowe, opublikuję to, co wymyśliłem.Używając
SequenceMather
zdifflib
możesz porównać dwie listy jakdiff
robi. Żadna z pozostałych odpowiedzi nie wskaże Ci miejsca, w którym występuje różnica, ale ta robi. Niektóre odpowiedzi podają różnicę tylko w jednym kierunku. Niektórzy zmieniają kolejność elementów. Niektóre nie obsługują duplikatów. Ale to rozwiązanie daje prawdziwą różnicę między dwiema listami:To daje:
Oczywiście, jeśli Twoja aplikacja przyjmuje te same założenia, co inne odpowiedzi, skorzystasz z nich najbardziej. Ale jeśli szukasz prawdziwej
diff
funkcjonalności, jest to jedyna droga.Na przykład żadna z pozostałych odpowiedzi nie mogła obsłużyć:
Ale ten robi:
źródło
Spróbuj tego:
źródło
może to być nawet szybsze niż zrozumienie listy Marka:
źródło
from itertools import filterfalse
tutaj bit. Zauważ też, że to nie zwraca sekwencji jak inne, zwraca iterator.Oto
Counter
odpowiedź na najprostszy przypadek.Jest to krótszy niż powyższy, który robi dwukierunkowe różnice, ponieważ robi dokładnie to, o co pyta pytanie: generuje listę tego, co jest na pierwszej liście, ale nie na drugiej.
Alternatywnie, w zależności od preferencji czytelności, tworzy przyzwoitą jednowarstwową:
Wynik:
Pamiętaj, że możesz usunąć
list(...)
połączenie, jeśli tylko wykonujesz iterację.Ponieważ to rozwiązanie wykorzystuje liczniki, odpowiednio obsługuje ilości w porównaniu z wieloma odpowiedziami opartymi na zestawie. Na przykład na tym wejściu:
Dane wyjściowe to:
źródło
Możesz użyć naiwnej metody, jeśli elementy difflist zostaną posortowane i ustawione.
lub metodami natywnymi:
Naiwny roztwór: 0,0787101593292
Rozwiązanie zestawu natywnego: 0,998837615564
źródło
Trochę spóźniłem się na tę grę, ale możesz porównać wydajność niektórych z wyżej wspomnianego kodu z tym, dwóch najszybszych konkurentów,
Przepraszam za podstawowy poziom kodowania.
źródło
Oto kilka prostych, zachowujących porządek sposobów różnicowania dwóch list ciągów.
Kod
Nietypowe podejście wykorzystujące
pathlib
:Zakłada się, że obie listy zawierają ciągi o równoważnych początkach. Więcej informacji można znaleźć w dokumentacji . Uwaga: nie jest szczególnie szybki w porównaniu do operacji ustawionych.
Prosta implementacja wykorzystująca
itertools.zip_longest
:źródło
temp1
itemp2
linia się dobrze. Jeśli na przykład odwrócisz elementytemp2
lub wstawisz inną wartość na początkutemp2
, listcomp zwróci tylko te same elementy, co wtemp1
To jest inne rozwiązanie:
źródło
Jeśli napotkasz
TypeError: unhashable type: 'list'
, musisz zamienić listy lub zestawy w krotki, npZobacz także Jak porównać listę list / zestawów w pythonie?
źródło
Powiedzmy, że mamy dwie listy
z powyższych dwóch list możemy zobaczyć, że pozycje 1, 3, 5 istnieją na liście 2, a pozycje 7, 9 nie. Z drugiej strony pozycje 1, 3, 5 istnieją na liście 1, a pozycje 2, 4 nie.
Jakie jest najlepsze rozwiązanie, aby zwrócić nową listę zawierającą pozycje 7, 9 i 2, 4?
Wszystkie powyższe odpowiedzi znajdują rozwiązanie, co jest teraz najbardziej optymalne?
przeciw
Za pomocą timeit możemy zobaczyć wyniki
zwroty
źródło
jednowierszowa wersja rozwiązania arulmr
źródło
jeśli chcesz czegoś bardziej jak zestaw zmian ... możesz użyć Counter
źródło
Możemy obliczyć przecięcie minus suma list:
źródło
Można to rozwiązać za pomocą jednej linii. Pytanie zawiera dwie listy (temp1 i temp2) zwracające różnicę w trzeciej liście (temp3).
źródło
Oto prosty sposób na rozróżnienie dwóch list (niezależnie od zawartości), możesz uzyskać wynik, jak pokazano poniżej:
Mam nadzieję, że to pomoże.
źródło
Wolę używać konwersji do zbiorów, a następnie funkcji „różnic ()”. Pełny kod to:
Wynik:
Najłatwiejsze do podkreślenia, a także w przyszłości, jeśli będziesz pracować z dużymi danymi, przekształcenie ich w zestawy usunie duplikaty, jeśli duplikaty nie będą wymagane. Mam nadzieję, że to pomoże ;-)
źródło
źródło
np. czy
list1 = [10, 15, 20, 25, 30, 35, 40]
ilist2 = [25, 40, 35]
wtedy zwrócona lista będzieoutput = [10, 20, 30, 15]
źródło