Seite 1 von 1

Problem mit Substrings in Listenelementen

Verfasst: Mittwoch 13. Juni 2012, 13:00
von x1334
Hallo.

Erstmal...bin leider nicht sehr erfahren mit Python, lerne aber von Tag zu Tag mehr.
Ich habe folgendes Problem:

Ich generiere eine Liste aus einer Textdatei mit 3 Werten pro Zeile.

Code: Alles auswählen

for line in wac:
    pruefvalues = line.split()
    noun = pruefvalues[0]
    nounlist.append(noun)
    hypernym = pruefvalues[1]
    hypernymlist.append(hypernym)
    glevels = pruefvalues[2]
Das ganze sieht entweder so

Code: Alles auswählen

Autonomen-Bewegung	_	_
oder so

Code: Alles auswählen

Autonomieabkommen_44814	Zustand_18378	1
aus. Die Nomen sind folglich in nounlist, die entsprechenden Hyperonyme in hypernymlist

Nun versuche hiermit ich einige Wörter aus dieser Liste abzufragen mit normalen Nomen ohne Zusätze am Ende, weiß aber nicht, wie ich die _xxxxx Werte ignoriere, sprich nur suche ob der gesuchte Substring enthalten ist.
Wenn ich ohne Liste arbeite funktioniert das ganze einfach mit:

Code: Alles auswählen

if nomen in noun: ...
leider aber nicht so:

Code: Alles auswählen

if nomen in nounlist:
Habe es auch schon mit set versucht aber leider funktioniert das auch nicht.

Re: Problem mit Substrings in Listenelementen

Verfasst: Mittwoch 13. Juni 2012, 13:22
von webspider
Du kannst dafür eine kleine Funktion schreiben à la:

Code: Alles auswählen

def substring_in_list(substring, list):
    for item in list:
        if substring in item:
            return True
    return False
Davon abgesehen: Wäre nicht das hier eine kürzere Version deines Code-Beispiels?

Code: Alles auswählen

for line in wac:
    noun, hypernum, glevels = line.split()
    nounlist.append(noun)
    hypernymlist.append(hypernym)

Re: Problem mit Substrings in Listenelementen

Verfasst: Mittwoch 13. Juni 2012, 13:24
von BlackJack
@x1334: Du musst halt auch bei der Liste jedes einzelne Element prüfen und nicht versuchen das über den ``in``-Operator auf der Liste zu lösen. Wobei statt ``in`` auch die `startswith()`-Methode eine Möglichkeit wäre die etwas genauer das prüft was Du eigentlich wissen willst. Beides hat aber das Problem das auch Sachen „wahr” sind, die Du vielleicht gar nicht haben willst:

Code: Alles auswählen

In [379]: 'Bewegung' in 'Autonomen-Bewegung'
Out[379]: True

In [380]: 'Autonomen-Bewegung'.startswith('Auto')
Out[380]: True
Bei der Namensgebung solltest Du keine Abkürzungen verwenden, die nicht allgemein bekannt sind (WTF is `wac`?) und man sollte den Datentyp nicht im Namen kodieren, denn dann bekommt man Probleme wenn der sich mal ändern sollte. Dann muss man entweder überall den Namen ändern, oder man hat falsche Informationen im Quelltext stehen, die den Leser verwirren.

Du musst auch nicht jeden Zwischenwert an einen eigenen Namen binden. `pruefvalues` kann man sich zum Beispiel sparen in dem man gleich das Ergebnis des aufteilens an die drei Namen bindet: ``noun, hypernym, glevels = line.split()``.

Wenn ich das richtig sehe benutzt Du dann mehrere Listen die „parallel” zusammengehörende Informationen enthalten. Das sollte man vermeiden. Zusammengehörende Informationen sollte man auch in einer Datenstruktur zusammen fassen.

Re: Problem mit Substrings in Listenelementen

Verfasst: Mittwoch 13. Juni 2012, 13:59
von Hyperion
webspider hat geschrieben:Du kannst dafür eine kleine Funktion schreiben à la:

Code: Alles auswählen

def substring_in_list(substring, list):
    for item in list:
        if substring in item:
            return True
    return False
Oder mittels `any` und Generatorausdruck in kurz:

Code: Alles auswählen

def substring_in_list(substring, list):
    return any(substring in item for item in list)
Aber generell stimme ich BlackJacks letztem Einwurf zu. Eine passendere Struktur wäre Schritt eins ;-)