Funktion Liste mit zwei Parametern

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
Benutzeravatar
Atlanta
User
Beiträge: 2
Registriert: Samstag 7. Januar 2017, 16:10
Kontaktdaten:

Hallo liebe Slytherin-Community


Ich hänge nun schon seit einer kleinen Weile an einer Aufgabe fest, ich habe schon einige Varianten ausprobiert aber nichts hilft. Vielleicht kann mir ja jemand von euch einen Hinweis darauf geben, wo was schieft hängt?

Ich werkle an einer Funktion rum, die als Parameter eine Liste und eine Sequenz eines Elements der Liste erhält. Nehmen wir an, die Liste würde ein Element ["Hallo"] enthalten; ich möchte nun, dass wen ich die Funktion aufrufe (allIndex(liste,"l")) mir das Programm die Positionen der gesuchten Sequenz (in diesem Fall "l") ausgibt, gleichzeitig soll sie mir bei einer allfälligen eingabe einer nicht vorhandenen Sequenz (z.B "k") eine entsprechende Antwort ausgeben. In Conclusio:

Zurückgegeben werden soll eine Liste mit allen Index-
Positionen, an denen "element" vorkommt. Falls element nicht in der Liste vorkommt, wird z.B -1 zurückgegeben.



##def allIndex(liste, element):
## list(liste)
## for position, element in enumerate(liste):
print(position, element)
##
##allIndex("Hallo", "l")


Meine Eingaben sind Kraut und Rüben und ich wäre sehr froh, wenn mich jemand in eine richtung "schubsen" könnte, sprich mir empfehlen, was für ein Befehl/Anwendung hierfür sinnvoll ist.

Mit dem befehl "for position, element in enumerate(liste):
print(position, element)"

möchte ich die liste, die durch den Befehl "list" "verlistet" wird nummerieren und dadurch durchsuchbar für eine einzelne Sequenz machen ->
Sprich das Programm müsste nach "l" suchen.

Für allfällige Störungen oder entstehende Umstände entschuldige ich mich im Voraus.

Liebe Grüsse

Atlanta
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Möchtest du so etwas in der Richtung?

Code: Alles auswählen

In [1]: s = 'flusskrebs'

In [2]: def iter_indices(s, char):
   ...:     start = 0
   ...:     while True:
   ...:         try:
   ...:             position = s.index(char, start)
   ...:         except ValueError:
   ...:             return
   ...:         yield position
   ...:         start = position + 1
   ...:         

In [3]: list(iter_indices(s, 's'))
Out[3]: [3, 4, 9]
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Atlanta: Deine Eingabe ist eine Liste mit Sequenzen? Dann wäre das Ergebnis doch eine Liste von Listen mit Positionen. Was aber mehr Sinn machen würde, war als Parameter nur eine Sequenz zu nehmen, und die nicht noch extra in eine Liste zu packen. So wie Deine Funktion nämlich jetzt aussieht, wird nur die äußere Liste mit for durchlaufen und nicht die inneren Sequenzen. Wenn der Rückgabewert eine Liste von Positionen ist, dann wäre die natürliche Antwort, wenn das Element nicht in der Sequenz vorkommt, eine leere Liste.

Vielleicht hilft Dir das schon weiter, wenn Du meine Verwirrung aufklären kannst und damit selbst das Problem etwas klarer siehst.
BlackJack

@Atlanta: Anmerkung zum Rückgabewert: Der sollte in jedem Fall gleichartig sein. Also Liste oder -1 ist keine gute Idee. Warum nicht in *jedem* Fall die Liste der Treffer. Wenn kein Treffer, dann ist das eben eine leere Liste. Das vereinfacht sowohl den Code in der Funktion, als auch den beim Aufrufer weil der nicht mit Sonderfällen umgehen muss wenn er nicht tatsächlich muss/will. Beispiel: Ausgabe aller Treffer. Mit komischem Sonderwert:

Code: Alles auswählen

indices = all_indices(haystack, needle)
if indices != -1:
    for index in indices:
        print(index)
Ohne komischen Sonderwert:

Code: Alles auswählen

for index in all_indices(haystack, needle):
    print(index)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das geht am besten entweder (wie schon gezeigt) mit find() oder sozusagen rein pythonisch:

Code: Alles auswählen

def findall(iterable, needle):
    return [i for i, item in enumerate(iterable) if item == needle]
Wenn das gesuchte Element nicht vorhanden ist, wird eine leere Liste geliefert.
Benutzeravatar
Atlanta
User
Beiträge: 2
Registriert: Samstag 7. Januar 2017, 16:10
Kontaktdaten:

Vielen Dank an die schnellen Hilfen, ich werde mich gleich ans werkeln machen und eure Vorschläge und HInweise prüfen und danach ein Feedback geben..:) :D
Antworten