Seite 1 von 1

Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Mittwoch 7. Januar 2015, 15:36
von kidchino
Hi zusammen,

ich suche einen Begriff in einer Liste. Der sollte eigentlich immer an der Stelle 58 sein, ist er wohl auch nicht. Deswegen suche ich nun so

Code: Alles auswählen

for cell in row:
          if cell == "WOS:000300581200005":
                   print(dateiname, row[58]) 
Dies Ausgabe zeigt mir welches Datei gerade angeschaut wird und was an der Stelle 58 für ein Wert in der Liste ist, weil dort ja eigentlich der Suchbegriff stehen sollte.
Kann ich mir auch ausgeben lassen, wo der Suchbegriff gefundenn wurde? Also an welche Stelle der Liste?
VG
kid

Re: Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Mittwoch 7. Januar 2015, 15:38
von BlackJack
@kidchino: Listen haben eine `index()`-Methode.

Re: Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Mittwoch 7. Januar 2015, 15:46
von kidchino
@BlackJack.
Perfekt danke

Code: Alles auswählen

print(dateiname, row[58], row.index("WOS:000300581200005"))

Re: Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Mittwoch 7. Januar 2015, 16:08
von Sirius3
@kidchino: Du hast zwei Möglichkeiten:

Code: Alles auswählen

for idx, cell in enumerate(row):
    if cell == "WOS:000300581200005":
           print(dateiname, row[58], idx)
oder ohne for-Schleife:

Code: Alles auswählen

    try:
        idx = row.index("WOS:000300581200005")
    except ValueError:
        # nicht gefunden
        pass
    else:
        print(dateiname, row[58], idx)

Re: Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Mittwoch 7. Januar 2015, 20:03
von snafu
Kann man auch anders schreiben:

Code: Alles auswählen

try:
    idx = row.index("WOS:000300581200005")
    print(dateiname, row[58], idx)
except ValueError:
    print('not found')

Re: Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Mittwoch 7. Januar 2015, 20:15
von EyDu
@snafu: Im try-Block sollte so wenig wie möglich stehen, damit mit nicht ungewollt andere Ausnahmen abgefangen werden. Zum Beispiel:

Code: Alles auswählen

try:
    idx = row.index("WOS:000300581200005")
    int("spam")
    print(dateiname, row[58], idx)
except ValueError:
    print('not found')

Re: Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Donnerstag 8. Januar 2015, 19:07
von snafu
Ich stimme grundsätzlich zu, dass eine gewisse Fehleranfälligkeit vorhanden ist, wenn man mehr als nötig in einem ``try``-Block erledigt. Aber manchmal sollte man auch Ausnahmen machen können. Ein ``except ... pass ... else``-Konstrukt, nur um hier diese Regel einzuhalten, wirkt auf mich jedenfalls eher unschön.

Re: Suche in Liste und Ausgabe der "Fundstelle"

Verfasst: Donnerstag 8. Januar 2015, 20:56
von BlackJack
@snafu: Das ist keine Regel um der Regel willen sondern einfach saubere Programmierung die weniger fehleranfällig ist. Irgendwann kommt in dem Teil den man *nicht* auf die Ausnahme überprüfen möchte noch etwas hinzu oder man verändert nur eine Funktion woanders die in so einem ``try``-Block verwendet wird, und schon hat man sich potentiell einen Fehler eingebaut wenn man das Konstrukt *dann* nicht umbaut. Lieber gleich korrekten Code schreiben, beziehungsweise welchen der weniger leicht durch Änderungen fehlerhaft werden kann. Vor allem ist das ja gar keine grosse, komplizierte Sache die irgendwie besonderen Aufwand bedeuten würde beim schreiben. Was an dem Konstrukt unschön ist sehe ich auch nicht, im Gegenteil finde ich die Möglichkeit mit dem ``else`` sehr schön. Bei Sprachen wo es das nicht gibt, wird es tatsächlich unschön wenn man so einen Fall dann doch wieder mit Flags oder speziellen Fehlerwerten nach der Ausnahmebehandlung abarbeiten möchte. Dann müsste das nämlich so aussehen:

Code: Alles auswählen

idx = None
try:
    idx = row.index("WOS:000300581200005")
except ValueError:
    print('not found')

if idx is not None:
    print(dateiname, row[58], idx)
Falls `idx` beliebige Werte annehmen kann, also auch `None`, müsste man sich extra einen „Sentinel”-Wert dafür erzeugen auf den man prüfen kann. Bei vielen statisch typisierten Sprachen geht nicht mal das, da muss man dann noch eine extra Variable für ein Flag einführen. Ich finde ``else`` zum ``except`` wirklich *schön*. :-)