Vergleich von Zeichen in Zeichenketten
Ich versuche eine Funktion zu erzeugen, vergleicht Zeichen in der gleichen position von zwei Saiten von gleicher Länge und gibt die Anzahl der Unterschiede.
Beispielsweise
a = "HORSE"
b = "TIGER"
Und würde es wieder 5 (wie alle Zeichen in der gleichen position unterschiedlich)
Hier ist, was ich gearbeitet habe.
def Differences(one, two):
difference = []
for i in list(one):
if list(one)[i] != list(two)[i]:
difference = difference+1
return difference
Dass gibt eine Fehlermeldung "List indices must be integers nicht strings"
Und so habe ich versucht, drehen Sie es in int durch Verwendung von int(ord(
def Differences(one, two):
difference = 0
for i in list(one):
if int(ord(list(one)[i])) != int(ord(list(two)[i])):
difference = difference+1
return difference
Denen auch wieder die gleichen Fehler.
Wenn ich die Liste drucken(ein)[1] != Liste(zwei)[1] es eithers gibt True oder False zurück, so ist der Vergleich richtig gemacht.
Können Sie mir sagen, wie zu beheben mein code für diesen Zweck?
["H","O","R","S","E"]
als "ich" Werte in der Sie for-loop, die offensichtlich nicht von Indizes (D. H. - 0,1,2,3,4).InformationsquelleAutor Denis Moura | 2016-06-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde wahrscheinlich Durchlaufen beide gleichzeitig mit Reißverschluss und eine Liste mit Verständnis und nehmen Sie dann die Länge der Liste:
Zippen paar Listen zusammen-index-index und Stoppt, wenn man läuft. Liste Verstehens sind Generatoren, die im Grunde kompakte for-Anweisungen, die Sie hinzufügen können, die Logik. So ist es im Grunde liest: für jeden RV paar Buchstaben (c,d), wenn c!=d setzen Sie anschließend ein in die Liste (also, wenn die Buchstaben anders sind, erhöhen wir die Liste der Länge 1). Dann nehmen wir eben die Länge der Liste, die alle Briefe, die sind positionsbezogen anders.
Wenn man bedenkt, fehlende Buchstaben, anders zu sein, dann können wir itertools.zip_longest, füllen Sie den rest des Wortes:
Offensichtlich, Keiner wird nie das gleiche Zeichen, so ist der Unterschied in der Länge registriert werden.
EDIT: Das wurde noch nicht erwähnt, aber wenn wir wollen, Fall-Gefühllosigkeit, dann müssen Sie nur ausführen .lower() oder .casefold() auf die Zeichenfolgen vorher.
InformationsquelleAutor Reid Ballard
sum([int(i!=j) for i,j in zip(a,b)])
würde den trick tunzip
wird keine Ausnahme ausgelöst, die entwederInformationsquelleAutor user3404344
verwenden
zip
Iteration über beide Saiten nacheinanderauch die Allgemeine Stil ist die Kleinschreibung von Funktionsnamen (die sind oft Verben) und Titel Fall Klassennamen (die sind oft Substantive) 🙂
InformationsquelleAutor Jordan Bonitatis
Könnte man etwas wie das hier tun:
Die einzige Sache, die Sie implementieren müssen, um sich selbst hier ist die überprüfung für die Größe des strings. In meinem Beispiel, wenn
a
ist größer alsb
sind, dann gibt es eineIndexError
.InformationsquelleAutor John-Paul Ensign
versuchen Sie dies:
es ist wichtig, um den ersten check Ihrer Größe im Fall, dass die zweite Zeichenkette kürzer als die erste, so dass Sie nicht bekommen, eine
IndexError
InformationsquelleAutor Jon McClung
Als Angelegenheiten, die für die Komplexität und Laufzeit, Anrufliste() in jeder iteration ist nicht effizient, denn es trennt die strings Speicher reserviert und auf...
Der richtige Weg, es zu tun, ist die Iteration der index der Listen, vergleichen Sie Sie, indem Sie es, so etwas wie:
InformationsquelleAutor Aviad
Gibt es ein paar Probleme:
Erstens
list(one)
ist['H', 'O', 'R', 'S', 'E']
beim AufrufDifferences(a, b)
so sind Sie zu iterieren über strings nicht mit int-Werten. Ändern Sie Ihren code so:iteriert über ganze zahlen von 0-4, die in Ihrem Fall nicht nur, weil
a
undb
die gleiche Länge haben (müssen Sie kommen mit einer besseren Lösung, wenn Sie wollen, um die Handhabung der verschiedenen Länge-Eingänge).Zweitens können Sie nicht hinzufügen, um ein array, so dass Sie es ändern sollte ein
int
die Sie hinzufügen. Das Ergebnis wäre:Wenn Sie super halten, um ein array zu verwenden, können Sie jedoch anfügen, um ein array:
difference.append(1)
und dann wieder die Länge des Arrays:return len(difference)
aber das wäre ineffizient für das, was Sie versuchen zu erreichen.InformationsquelleAutor EngineerCamp
Finden Sie heraus, für sich selbst
Glück!
InformationsquelleAutor Eduardo Cuesta
Sehen, ob das funktioniert 🙂
InformationsquelleAutor Nick Davies
Das ist zu einfach:
InformationsquelleAutor Ahmad