Index von string in dem das gesuchte Wort vorkommt

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
sarbot
User
Beiträge: 5
Registriert: Mittwoch 4. September 2013, 14:50

Hey,
ich bin gerade dabei von matlab auf python umzusteigen. Bei einem meiner ersten Programme stolpere ich über folgendes Problem:

Ich möchte den Index eines strings aus einer liste haben:

Code: Alles auswählen

 liste.index(str)
bei dem string handelt es sich jedoch um einen dateinamen mit seiner größe und die größe ändert sich ständig. Daher würde mich interessieren obs ne kombination von find() und index() gibt, da ich ja nur einen Teil des strings weiß.

Vielleicht gibt es ja sogar etwas so simples wie * als platzhalter oder ähnliches ?

Code: Alles auswählen

liste.index(*'strg'*)
Meine unelegante zu fuß alternative wäre sowas wie:

Code: Alles auswählen

for l in liste:
 
if find(str) >= 0:
 print l
wäre das machbar? wie müsste der find befehl genau lauten auf welches objekt bezieht er sich (soll in jedem eintrag prüfen ob str vorhanden)
BlackJack

@sarbot: `list.index()` vergleicht auf Gleichheit, da kann man nichts anderes mit machen. Wenn Du den ersten Index bei einer Liste mit Zeichenketten wissen möchtest wo eine Teilzeichenkette vorkommt, dann musst Du Dir dafür eine Funktion schreiben.

Code: Alles auswählen

def index_contains(needle, haystack):
    for i, item in enumerate(haystack):
        if needle in item:
            return i
    raise ValueError('not contained in any element')
Das klingt aber alles ein wenig komisch. Was ist denn das *eigentliche* Problem welches gelöst werden soll?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sarbot hat geschrieben: ...bei dem string handelt es sich jedoch um einen dateinamen mit seiner größe und die größe ändert sich ständig. Daher würde mich interessieren obs ne kombination von find() und index() gibt, da ich ja nur einen Teil des strings weiß.
Es gibt die Methode ``str.startswith(prefix)`` - suchst Du das?

Ich kapiere allerdings nicht, wieso der Dateiname und die Größe in *einem* String stehen. Kann man die nicht aufteilen und in einer Liste, Dictionary oder gar einer Klasse getrennt verwalten?

Ich stelle mir das bei Dir grad so vor:

Code: Alles auswählen

filenames = ["foo.txt 10KB", "bar.csv 20MB", ...]
Und Du kennst eben nur "foo.txt"

Besser wäre doch so etwas:

Code: Alles auswählen

fileinfos = [("foo.txt", "10KB"), ("bar.txt", "20MB")]
Dort könnest Du dann tatsächlich auf den exakten Vergleich mit den Namen gehen!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sarbot
User
Beiträge: 5
Registriert: Mittwoch 4. September 2013, 14:50

Also ich habe mir ein script geschrieben, welches leere ordner und unterordner löscht, sowie dateien die eine bestimmte zeit nicht benutzt wurden und eine angegebene größe unterschreiten.
Dazu habe ich mit dem linux konsolen programm tree eine datei erstellt in der "dateigröße änderungsdatum pfadzurdatei"
steht. Diese dann mit meinem script ausgewertet. Die problematik war, dass sich die einzulesene sowie die script datei selbst gelöscht haben beim ausführen (wenn kein änderungsdatum angegeben).
Deshalb wollte ich die beiden einträge aus der Liste löschen.

Sicherlich nicht der einfachste weg und ganz sicher nicht der Schönste. Inzwischen weiß ich auch dass es python intern befehle gibt die informationen über pfade und ordner/dateien auslesen können, um den umweg über "tree" nicht machen zumüssen. Außerdem wäre es dann plattformunabhängig.
Hyperion hat geschrieben: Besser wäre doch so etwas:

Code: Alles auswählen

fileinfos = [("foo.txt", "10KB"), ("bar.txt", "20MB")]
Dort könnest Du dann tatsächlich auf den exakten Vergleich mit den Namen gehen!
Ah ok ich habe das Kapitel mit den Dictionarys gleich in zwei büchern durchgearbeitet mir ist aber nicht in den sinn gekommen, sie hier zu benutzen. Jetzt ist mir klar, dass man sie nicht nur als Lexikon oder Adressbuch benutzen kann;) Danke. Aber als Übung werde ich diesen Ansatz eventuell nochmal durchgehen.
BlackJack hat geschrieben:

Code: Alles auswählen

def index_contains(needle, haystack):
    for i, item in enumerate(haystack):
        if needle in item:
            return i
    raise ValueError('not contained in any element')
Das klingt aber alles ein wenig komisch. Was ist denn das *eigentliche* Problem welches gelöst werden soll?
Komisch klingt es warscheinlich vorallem deshalb, weil ich nicht den elegant üblichen weg gehe meine idee umzusetzen. Mangels Erfahrung :oops: . Aber deine funktion ist genau die die ich gesucht habe. Danke es funktioniert :)

Ich werde wenn ich Zeit hab das Programm vlt. nochmal umschreiben ohne "tree" und mit Dictionary

Vielen Dank für die schnelle Hilfe
lg Sarbot

-solved-
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sarbot hat geschrieben:
Hyperion hat geschrieben:

Code: Alles auswählen

fileinfos = [("foo.txt", "10KB"), ("bar.txt", "20MB")]
Ah ok ich habe das Kapitel mit den Dictionarys gleich in zwei büchern durchgearbeitet mir ist aber nicht in den sinn gekommen, sie hier zu benutzen.
Du hast hier gar kein Dictionary. Du hast eine Liste. Deren Elemente sind Tupel.

Code: Alles auswählen

for entry in fileinfos:
    print('File: {}'.format(entry[0]))
Antworten