2014-10-30 18 views
5

Mam dwie płaskie listy, w których jedna z nich zawiera zduplikowane wartości. Na przykładPython przecięcie dwóch list zachowujących duplikaty

array1 = [1,4,4,7,10,10,10,15,16,17,18,20] 
array2 = [4,6,7,8,9,10] 

Muszę znaleźć wartości w tablica1, które są również w tablica2, utrzymując duplikaty w tablica1. Pożądany wynik będzie

result = [4,4,7,10,10,10] 

chcę uniknąć pętli jak rzeczywistych macierzy będzie zawierał w ciągu milionów wartości. Próbowałem różnych kombinacji zestawów i przecięć, ale po prostu nie mogłem zachować duplikatów ..

Każda pomoc zostanie bardzo doceniona!

+1

Nie można uniknąć pętli .. jeśli używasz funkcji bibliotecznych .. one faktycznie używają pętli w swoim projekcie – mlwn

Odpowiedz

4

Co masz na myśli mówiąc, że nie chcesz używać pętli? Będziesz musiał to powtórzyć w ten czy inny sposób. Wystarczy wziąć w każdej pozycji osobno i sprawdzić, czy to w array2 as you go:

items = set(array2) 
found = [i for i in array1 if i in items] 

Ponadto, w zależności od tego, jak masz zamiar użyć wynik, należy rozważyć generatora:

found = (i for i in array1 if i in array2) 

, dzięki czemu nie będziesz musiał mieć wszystkiego w pamięci naraz.

+0

Chodzi mi o to, chcę wiedzieć, czy jest na to skuteczny sposób, ponieważ będę pracował z bardzo dużym rozmiarem tablice z ograniczeniami czasowymi .. – user32147

+0

@ user32147: Dlaczego nie określisz rozmiarów tablic (dokładniej niż "ponad miliony wartości") i ograniczeń czasowych? – NPE

+0

@ user32147 Jest to całkiem wydajne: nie uzyskasz szybciej niż O (n). Ale mimo to zobacz moją edycję, poprawiłem odpowiedź. –

3

Nie po to zrobi:

array1 = [1,4,4,7,10,10,10,15,16,17,18,20] 
array2 = [4,6,7,8,9,10] 
set2 = set(array2) 
print [el for el in array1 if el in set2] 

Utrzymuje porządek i powtórzeń elementów array1.

Zmienia array2 w zestaw dla szybszych wyszukiwań. Należy zauważyć, że jest to korzystne tylko wtedy, gdy array2 jest wystarczająco duże; jeśli array2 jest mały, może być bardziej wydajny, aby zachować go jako listę.