Anfängerfrage: zeilenweiser Textvergleich

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
Benutzeravatar
_johannes
User
Beiträge: 20
Registriert: Montag 19. Juni 2006, 17:37

Hallo,

Bin zwar kein blutiger Anfänger mehr, aber stosse als Autodidakt doch immer wieder an Grenzen. Wahrscheinlich steht die Lösung für mein folgendes Problem auch schon in den Python-Büchern, die vor mir liegen (2x Weigend), aber ich weiss eben nicht, nach was für nem Stichwort ich suchen soll.

Also, folgendes:

Ich habe ein Skript geschrieben, das zwei Textdateien durchsucht, die durchnummerierte Zeilen enthalten. Zunächst sucht es in der einen Datei alle Zeilen raus die einem bestimmten Kriterium entsprechen und schreibt diese in eine Liste.
Dann durchsucht es die andere Datei nach einem anderen Kriterium und schreibt auch dort die Treffer in eine Liste.

Beide Dateien sind gleich durchnummeriert gewesen, d.h. ungefähr so:

Datei 1
1/abc
2/def
3/ghi
4/jkl
...

Datei 2
1/xyz
2/uvw
3/rst
4/opq
...

Die Liste von Datei 1 enthält jetzt z.B. ['1/abc', '3/ghi', '4/jkl'], die Liste von Datei 2 enthält in meinem Fall hier nur die Zahlen am Anfang, d.h. ['2', '3', '4'].

So. Soweit geht es. Jetzt möchte ich die beiden Listen miteinander vergleichen und zwar so, dass ich am Ende eine dritte Liste habe, in der nur die Teile aus Liste 1 stehen, deren Zahl am Anfang auch in Liste 2 vorkommt, also in meinem Beispiel: ['3/ghi', '4/jkl'].

Ich hab so viel mit try and error rumprobiert, dass ich jetzt bald gar nichts mehr weiss, hier mein letzter Versuch, der aber anscheinend in einer Endlosschleife endet.

Code: Alles auswählen

liste3 = []
for a in liste2:
    for b in liste1:
        if re.search(a, b):
            liste3.append(b)
Wie löse ich das denn am geschicktesten?

Danke schon mal für Eure Hilfe.

Gruß, Johannes.
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

Code: Alles auswählen

[ x for x in liste1 if x.split('/')[0] in liste2 ]
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

_johannes hat geschrieben:Wie löse ich das denn am geschicktesten?
Wie wärs damit:

Code: Alles auswählen

In [9]: liste1 = ['1/abc', '3/ghi', '4/jkl']
In [10]: liste2 = ['2', '3', '4']
In [11]: liste3 = [element for element in liste1 if element.split('/')[0] in liste2]
In [12]: liste3
Out[12]: ['3/ghi', '4/jkl']
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich würde allerdings erste testen welche der beiden Listen/Dateien kürzer ist und über diese dann die Schleife bauen ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

jens hat geschrieben:Ich würde allerdings erste testen welche der beiden Listen/Dateien kürzer ist und über diese dann die Schleife bauen ;)
Liste3 soll aber Elemente aus Liste1 enthalten. Deshalb muss man die Schleife immer über Liste1 bauen, um halbwegs einfach an die neuen Elemente zu kommen.
MfG
HWK
Benutzeravatar
_johannes
User
Beiträge: 20
Registriert: Montag 19. Juni 2006, 17:37

:D
Dank an alle für die Tipps und Lösungen.
Jetzt funktioniert's.
Antworten