Python - strings Intersectiing
Versucht, zu schreiben für eine Funktion, die zwei strings und gibt das Zeichen, die sich in der Reihenfolge, dass Sie erscheinen in den ersten string.
Hier ist, was ich versucht habe:
def strIntersection(str1, str2):
for i in str1:
str3 = ''
str3 = str3.join(i for i in str1 if i in str2 not in str3)
return str3
str1 = 'asdfasdfasfd'
str2 = 'qazwsxedc'
strIntersection(str1,str2)
=> 'asdasdasd'
aber ich will nur das die Kreuzung Zeichen auf einmal angezeigt und in der Reihenfolge der ersten Zeichenfolge ie. 'asd'
Kann jemand helfen?
Ich habe festgestellt, dass einige ähnliche Probleme in anderen Foren, aber die Lösungen scheinen alle zu beteiligen-Listen in der Erwägung, dass, würde ich mag meine Ausgabe einen string
InformationsquelleAutor bang | 2012-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Check für stellen die andere Weise herum zu erhalten, um unter Kontrolle, und nicht emittieren die Zeichen, die Sie bereits emittiert:
Sicher, dass Sie könnte wieder schreiben, dass es eine Liste Verständnis, aber ich finde diese leichter zu verstehen.
Für Ihre test-Daten, erhalten wir:
''.join
ist idiomatischer und überhaupt nicht kompliziert. Verwenden Sie es in einer Schleife, aber verfehlt den Punkt. Eigentlich ist die for-Schleife in der OP-code ist völlig nutzlos; es ist einfach bewirkt, dass die eigentliche Arbeit -str3 = str3.join(i for i in str1 if i in str2 not in str3)
durchgeführt werden, mehrere Male, mit dem gleichen Ergebnis jedes mal und das Ergebnis weggeworfen jedes mal, aber die letzten.Kann man eigentlich nicht umschreiben, dieses bestimmten Algorithmus, um eine Liste zu verstehen - zumindest nicht, ohne Berufung auf einige sehr zweifelhafte undokumentierte Sachen, weil die Filterung Schritt
c in s2 and c not in out
hängt von den Teilergebnissen, die bis zu diesem Punkt, die nicht zugänglich gemacht werden (außer durch sehr zweifelhafte undokumentierten Funktionen).Ich habe gerade kommentiert, dass das ersetzen von
out
mit einer Liste würde die Dinge beschleunigen, aber dann haben einige timeit tests und festgestellt, dass Sie nicht, so entfernte ich meinen alten Kommentar. Meine timings zeigen, dass diese Lösung verwendet 10.7 usec per loop -, Karls-Lösung verwendet werden, 16.7 usec per loop und meine modifizierteout = []
undreturn "".join(out)
Lösung verwendet 18.5 usec per loop.Für diese besonderen Saiten, oder für welche test-Daten? Einen set-basierten Ansatz würde wahrscheinlich noch ziemlich lange Zeichenfolgen zu zeigen, ein Vorteil.
InformationsquelleAutor unwind
Du willst einen string, bestehend aus den eindeutigen Zeichen, die typisch sind für
str1
undstr2
, in der Reihenfolge erscheinen Sie instr1
.Einzigartigkeit und gemeinsamkeit implizieren set-Operationen: das heißt, wir suchen die Zeichen ein, die in beiden str1 und str2. Ein Satz ist grundsätzlich ungeordnet, aber wir können neu -, um die Daten, die durch das Sortieren der Zeichen nach Ihren "index" des ersten Vorkommens in
str1
. Dann ist es eine einfache Sache ist, erstellen Sie eine Zeichenfolge aus der sortierten Sequenz.Setzen Sie alle zusammen, erhalten wir:
InformationsquelleAutor Karl Knechtel
Können Sie die Verwendung von python legt http://docs.python.org/library/stdtypes.html#set um dies zu tun, etwa so:
InformationsquelleAutor ikanobori
einfachste Weg ist die Verwendung von sets in python
InformationsquelleAutor Rohit Malgaonkar
InformationsquelleAutor vartec
Es sieht aus wie Ihre aktuelle script sollte es tun, wenn Sie beheben den Schreibfehler in der vierten Zeile:
sollte
Ich würde nicht empfehlen, mit einem für diese simpy, weil Sie nicht garantieren die Ordnung. Dein Skript ist wahrscheinlich auch schneller.
(i for i in str1 if i in str2 and i not in str3)
. Außer diese funktioniert nicht, da diestr3
werden muss verglichen wurden noch nicht gebaut, noch nicht. Er hat seine Logik verwirrt durch den Versuch, beide zu verwenden, die for-Schleife und das Verständnis. Wie für Leistung, würde ich sicherlich erwarten, dassset
-basierte Ansätze, um viel schneller für lange strings.Ja, du hast Recht, ich werde zu aktualisieren, meine Antwort. Aber der Vergleich mit str3 sollte nicht das problem sein, da es nur die Teil, die bereits konstruiert worden.
Das problem ist, dass
str3
nicht ", der Teil, die bereits konstruiert worden". Entweder Sie führen diesen code in einer Schleife oder nicht. Wenn nicht, dannstr3
geben wird, UnboundLocalError - Sie versuchen zu finden zu der Sache, die Sie zuweisen. Wenn Sie das tun, dann haben Sie einejoin
und ein Verständnis keinen Sinn macht, da Sie nur wollen, zu berücksichtigen, das aktuelle Zeichen gegen die bereits gefunden kreuzenden Zeichen, nicht der gesamte string.Ich bin wirklich nicht wach heute! Ich vermisste beide die
str3 = ''
und diestr3.join(...)
beim Lesen. Ich war glaube, es war in einer Schleife.InformationsquelleAutor aquavitae