2017-04-26 2 views
1

Welcher der beiden ist ein optimaler und/oder mehr Python Code? Funktionen liefern, die Anzahl von Positionen im String-1, die das gleiche Zeichen in der entsprechenden Position in Zeichenfolge enthalten 2:Algorithmen zum Zählen von identischen Zeichen in der gleichen Position zwischen zwei Strings

def compare(s1, s2): 
    count = 0 
    for i in s1: 
     if i == s2[s1.index(i)]: 
      count += 1 
    print(count) 

def compare2(s1, s2): 
    count = 0 
    for i in range(0, len(s1)): 
     if s1[i] == s2[i]: 
      count += 1 
    print(count) 
+0

def vergleichen (s1, s2): \t count = 0 \t für i in s1: \t \t wenn i == s2 [s1.index (i)]: \t \t \t count + = 1 \t print (count) –

+0

, dass die erste Funktion ist, die aus irgendeinem Grund in der Post in die Frage ging –

+1

[ 'zip()'] (https://docs.python.org/3 /library/functions.html#zip) - ['enumerate()'] (https://docs.python.org/3/library/functions.html#enumerate) - ['sum()'] (https://docs.python.org/3/library/functions.html#sum) – spectras

Antwort

-2

Die zweite optimalere ist nicht als eine Funktion (c1.index()) aufrufen unnötig .

+0

Mehr auf den Punkt, der erste ist * falsch *; Wenn ein Zeichen zweimal vorhanden ist, gibt 'index()' immer nur die erste Position zurück, so dass der Code, der index verwendet, die korrekte Position in der zweiten Zeichenfolge nicht für die erste Instanz eines bestimmten Zeichens validiert. –

+0

Ja. Das habe ich vermisst! – rohan

1

Streng in der Bezeichnung der Leistung, die ersten Vergleich() quadratisch ist, weil es eine O (n) Index() Betrieb innerhalb einer O (n) for-Schleife hat. Die zweite compare2() ist viel besser, weil O (1) Random Access Indizierung mit i verwendet wird.

Das sagte, @CharlesDuffy wies auf Korrektheitsprobleme, die zuerst behoben werden müssen.

Für lange Strings, wo Funktionsaufruf Overhead nicht wichtig ist, sollten Sie diese Alternative, die sehr schnell laufen sollte:

>>> a = 'abcdefghijklmnopqrstuvwxyz' 
>>> b = 'a---e---i-----o-----u---y-' 
>>> sum(map(str.__eq__, a, b)) 
6 

In Python 2, fügen Sie diese Optimierung für eine verbesserte Cache-Effizienz:

>>> from itertools import imap   # iterator version of map() 
>>> sum(imap(str.__eq__, a, b)) 
6 
Verwandte Themen