2017-09-26 3 views
0

Ich möchte zählen, wie oft zwei Listen (list1 und list2) dieselbe Nummer im selben Index haben.Python: Anzahl der elementgleichen Elemente

Zunächst gibt es diesen Ansatz:

def count_common(list1, list2): 
    count = 0 
    for i, elem1 in enumerate(list1): 
     if elem1 == list2[i]: 
      count += 1 
    return count 

Dies ist O (n) Zeit und O (1) Raum.

Wenn ich die mehr Pythonic Weise versuchen, erhalte ich O (n) Raum:

def count_common(list1, list2): 
    return sum([1 for (elem1, elem2) in zip(list1, list2) if elem1 == elem2]) 

Gibt es eine Pythonic Art und Weise tun, die die O (1) Raum in meiner ersten Lösung verwendet hält?

Danke!

Antwort

3

Zuerst sollten Sie wirklich verstehen, dass die Verwendung von Einzeilern auch nicht mit Pythonic ist. Davon abgesehen, kann man einen Generator Ausdruck anstelle einer Liste Verständnis verwendet konstanten Raum zu verwenden:

sum(a == b for a, b in zip(list1, list2)) 

Ich würde tatsächlich die oben Einzeiler verwenden. Es ist sehr gut lesbar. Allerdings ist das Äquivalent für Schleife ebenso fein:

total = 0 
for a, b in zip(list1, list2): 
    total += a == b 

der Tat würde ich nicht überrascht, wenn die for-Schleife Ansatz mehr performant ist. Sie verlieren viel Generator-Overhead.

Verwandte Themen