Seite 1 von 1

Anfängerfrage: zeilenweiser Textvergleich

Verfasst: Dienstag 6. Februar 2007, 17:23
von _johannes
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.

Verfasst: Dienstag 6. Februar 2007, 17:34
von Luzandro

Code: Alles auswählen

[ x for x in liste1 if x.split('/')[0] in liste2 ]

Re: Anfängerfrage: zeilenweiser Textvergleich

Verfasst: Dienstag 6. Februar 2007, 17:35
von Leonidas
_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']

Verfasst: Dienstag 6. Februar 2007, 17:38
von jens
Ich würde allerdings erste testen welche der beiden Listen/Dateien kürzer ist und über diese dann die Schleife bauen ;)

Verfasst: Dienstag 6. Februar 2007, 21:01
von HWK
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

Verfasst: Mittwoch 7. Februar 2007, 14:33
von _johannes
:D
Dank an alle für die Tipps und Lösungen.
Jetzt funktioniert's.