Problem mit Substrings in Listenelementen

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
x1334
User
Beiträge: 13
Registriert: Mittwoch 13. Juni 2012, 12:34

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.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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)
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten