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.
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.
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).
Utilice set.intersection() Sie ist schnell und gut lesbar.
>>> set(a).intersection(b)
set([5])
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.
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.