Zwei Listen miteinander vergleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wido
User
Beiträge: 11
Registriert: Montag 16. Januar 2017, 23:11

Hallo,

wie kann ich zwei Listen miteinander vergleichen, um herauszufinden, ob Elemente von Liste A in Elementen von Liste B enthalten sind? Habe gedacht, dass ich es mit folgender Anweisung herauskriegen könnte.

Code: Alles auswählen

lines = open("textA.txt")
my_list = open("textB.txt")
for word in lines:
    for x in my_list:
        if word in x:
            print(word)
            print("Treffer")
Leider funktioniert es so nicht.
Zuletzt geändert von Anonymous am Dienstag 24. Januar 2017, 09:44, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Die innere Schleife benötigst du nicht. Aktuell iterierst du für jedes Element der ersten Liste über alle Elemente der zweiten Liste und vergleichst dann, ob das erste Element im zweiten enthalten ist, statt zu schauen, ob es in der Liste ist.
wido
User
Beiträge: 11
Registriert: Montag 16. Januar 2017, 23:11

Wenn ich das nur über die erste Schleife laufen lasse, kommt allerdings kein Treffer, obwohl Elemente von Liste A auch in Liste B existieren.

Code: Alles auswählen

lines = open("textA.txt")
my_list = open("textB.txt")
for word in lines:
        if word in my_list:
            print(word)
            print("Treffer")
Hier noch eine Erklärung zur besseren Veranschaulichung:
Zum Beispiel möchte ich in Erfahrung bringen, ob das Element[4] der Liste A, das den Stringwert „Berlin“ hat, in Elementen der Liste B als Teilstring vorkommt. Zum Beispiel könnte im Element[5] der Liste B der String „Berlin ist ein Stadtstaat“ stecken. In diesem Fall möchte ich, dass etwas ausgedruckt, z. B. Berlin und Treffer.
Zuletzt geändert von Anonymous am Dienstag 24. Januar 2017, 09:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@wido: Dein Problem ist, dass das Zeile-Ende-Zeichen noch an word hängt und so nur Wörter gefunden werden können, die am Ende der Zeilen aus textB liegen. Zum Anderen sind alle Zeilen aus textB nach dem ersten Durchlauf „verbraucht”, Du mußt also diese Zeilen in einer Liste speichern um sie immer wieder durchlaufen zu können. Drittens schließt Du die Dateien nicht wieder.
wido
User
Beiträge: 11
Registriert: Montag 16. Januar 2017, 23:11

Sirius3 hat geschrieben:@wido: Dein Problem ist, dass das Zeile-Ende-Zeichen noch an word hängt und so nur Wörter gefunden werden können, die am Ende der Zeilen aus textB liegen.
Ist das gelöst, wenn ich die Zeilen aus textB als Listenelemente speichere?
Sirius3 hat geschrieben:Zum Anderen sind alle Zeilen aus textB nach dem ersten Durchlauf „verbraucht”, Du mußt also diese Zeilen in einer Liste speichern um sie immer wieder durchlaufen zu können. Drittens schließt Du die Dateien nicht wieder.
Ok, die Zeilen liegen jetzt nun in einer Liste vor. Heißt das, dass ich das doch mit zwei for-Schleifen durchlaufen muss? Also so in etwa:

Code: Alles auswählen

lines = open("textA.txt")
for word in lines:
    for x in my_list:          #mylist ist nun eine Liste
        if word in my_list: 
            print(word)

lines.close()
Zuletzt geändert von Anonymous am Dienstag 24. Januar 2017, 13:30, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@wido: Nein, die Zeilenendezeichen verschwinden nicht auf magische Weise wenn man Zeichenketten in Listen steckt. Die muss man mit der entsprechenden Methode selbst explizit entfernen bevor man sie in die Liste steckt. Oder während, wenn sich eine „list comprehension“ anbietet.

Wo wird denn `x` verwendet?
wido
User
Beiträge: 11
Registriert: Montag 16. Januar 2017, 23:11

@BlackJack Das x wird in jedem Element von my_list verwendet. Ich möchte also, dass an jeder Indexstelle von my_list überprüft wird, ob ein Indexelment von lines vorkommt. Es soll ganz konkret überprüft werden, ob das jeweilige Element von lines als Teilstring in einem Element von my_list steckt. In beiden Listen sind nur Strings vorhanden.
BlackJack

@wido: Okay, dann anders herum: Das `x` in Deinem Code wird gar nicht verwendet. Das wird an jedes Element aus `my_list` gebunden und dann wird innerhalb der Schleife nichts damit gemacht. Das macht keinen Sinn.
Antworten