2014-10-30 19 views
5

Ich habe zwei flache Listen, in denen eine von ihnen doppelte Werte enthält. Zum BeispielPython-Schnittmenge zweier Listen, die Duplikate enthalten

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

Ich brauche Werte in array1 zu finden, die auch in array2 sind, die Duplikate in array1 HALTEN. Gewünschtes Ergebnis wird

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

I Schleifen als tatsächlicher Arrays vermeiden will, wird über Millionen von Werten enthalten. Ich habe verschiedene Set und Schnittkombinationen versucht, aber konnte einfach nicht die Duplikate ..

Jede Hilfe wird sehr geschätzt werden!

+1

können Sie Schleifen nicht vermeiden .. wenn Sie Bibliotheksfunktionen verwenden .. sie tatsächlich Schleifen in ihrem Design verwenden – mlwn

Antwort

4

Was meinen Sie wollen Sie nicht Schleifen verwenden? Du wirst auf die eine oder andere Weise darüber iterieren müssen. Nehmen Sie einfach in jedes Element einzeln und überprüfen, ob es in array2 ist, wie Sie gehen:

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

Darüber hinaus je nachdem, wie Sie das Ergebnis verwenden werden, sollten Sie einen Generator mit:

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

, so dass Sie nicht alles auf einmal in Erinnerung haben müssen.

+0

Ich meine, ich möchte wissen, ob es eine effiziente Möglichkeit, dies zu tun, wie ich mit sehr großen Größe arbeiten werde Arrays mit Timing-Einschränkungen. – user32147

+0

@ user32147: Warum geben Sie nicht die Größen der Arrays (genauer als "über Millionen von Werten") und die zeitlichen Beschränkungen? – NPE

+0

@ user32147 Das ist ziemlich effizient: Du wirst nicht schneller als O (n) bekommen. Aber sehen Sie sich meinen Schnitt trotzdem an, ich habe eine kleine Verbesserung der Antwort gemacht. –

3

Es folgt wird es tun:

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] 

Es hält die Reihenfolge und Wiederholungen von Elementen in array1.

Es wird array2 in ein Set für schnellere Lookups. Beachten Sie, dass dies nur sinnvoll ist, wenn array2 ausreichend groß ist; Wenn array2 klein ist, kann es leistungsfähiger sein, es als eine Liste zu behalten.

Verwandte Themen