Suche in Liste und Ausgabe der "Fundstelle"

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
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

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
BlackJack

@kidchino: Listen haben eine `index()`-Methode.
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

@BlackJack.
Perfekt danke

Code: Alles auswählen

print(dateiname, row[58], row.index("WOS:000300581200005"))
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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')
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@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')
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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*. :-)
Antworten