535 Stimmen

Wie kann ich zwei Listen in Python vergleichen und Übereinstimmungen zurückgeben

Ich möchte zwei Listen nehmen und die Werte finden, die in beiden erscheinen.

a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]

returnMatches(a, b)

würde zurückkehren [5] zum Beispiel.

691voto

SilentGhost Punkte 285785

Das ist zwar nicht die effizienteste, aber bei weitem die naheliegendste Methode, um dies zu tun:

>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
{5}

wenn die Reihenfolge von Bedeutung ist, können Sie es mit Listenauffassungen wie dieser tun:

>>> [i for i, j in zip(a, b) if i == j]
[5]

(funktioniert nur bei gleich großen Listen, was die Ordnungsbedeutung voraussetzt).

562voto

Utilice set.intersection() Sie ist schnell und gut lesbar.

>>> set(a).intersection(b)
set([5])

139voto

Joshmaker Punkte 3650

Ein kurzer Leistungstest zeigt, dass die Lösung von Lutz die beste ist:

import time

def speed_test(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()
        for x in xrange(5000):
            results = func(*args, **kwargs)
        t2 = time.time()
        print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
        return results
    return wrapper

@speed_test
def compare_bitwise(x, y):
    set_x = frozenset(x)
    set_y = frozenset(y)
    return set_x & set_y

@speed_test
def compare_listcomp(x, y):
    return [i for i, j in zip(x, y) if i == j]

@speed_test
def compare_intersect(x, y):
    return frozenset(x).intersection(y)

# Comparing short lists
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)

# Comparing longer lists
import random
a = random.sample(xrange(100000), 10000)
b = random.sample(xrange(100000), 10000)
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)

Dies sind die Ergebnisse auf meinem Rechner:

# Short list:
compare_bitwise took 10.145 ms
compare_listcomp took 11.157 ms
compare_intersect took 7.461 ms

# Long list:
compare_bitwise took 11203.709 ms
compare_listcomp took 17361.736 ms
compare_intersect took 6833.768 ms

Natürlich sollte jeder künstliche Leistungstest mit Vorsicht genossen werden, aber da die set().intersection() Die Antwort lautet Mindestens genauso schnell wie die anderen Lösungen und auch die am besten lesbare, sollte sie die Standardlösung für dieses häufige Problem sein.

91voto

Ich bevorzuge die Antworten auf der Basis von Mengen, aber hier ist eine, die trotzdem funktioniert

[x for x in a if x in b]

29voto

DisplacedAussie Punkte 4428

Schneller Weg:

list(set(a).intersection(set(b)))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X