Zugriff auf Listenelemente

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
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

hallo liebe Pythonexperten,
eine ganz grundsätzliche Anfängerfrage:
so viel ich auch suche, ich finde immer nur die Möglichkeit, auf Listeneinträge per Index zuzugreifen, und alle möglichen Massnahmen damit durchzuführen.

Aber was mache ich, wenn ich in einer Liste von, -sagen wir mal 100 Einträgen, - einen bestimmten suchen will, von dem ich noch nicht einmal weiß, ob er
überhaupt enthalten ist, und erst recht nicht, an welcher Stelle, oder wie oft?

Es müsste doch auch möglich sein, in einer Liste einen Wert zu suchen, statt den dazugehörigen Index ... :?

Vielleicht ist das ja eine furchtbar dilettantische Frage,
aber trotzdem vielen Dank im voraus, wenn mir da einer bescheid sagen könnte ...
Martin.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das geht mit `list.index()`:

Code: Alles auswählen

>>> ['a', 'b', 'c'].index('b')
1
>>> ['a', 'b', 'c'].index('z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 'z' is not in list
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

vielen Dank snafu,
so einfach und ich suche schon Tage danach..
aber noch eine kleine Zusatzfrage: was, wenn ein Element öfter in der Liste ist?
[1,3,4,3,6].index(3)
>>>1
hier wird nur der erste Dreier angezeigt... :|
sorry, ich nerve sicher..
Martin
BlackJack

@haeuslermartin: Wenn Du alle Indizes haben willst, dann musst Du etwas dafür programmieren. Da gibt es keine fertige Methode. Andererseits lässt sich das mit einer „list comprehension” und `enumerate()` sehr einfach ausdrücken:

Code: Alles auswählen

In [1]: [i for i, v in enumerate([1, 3, 4, 3, 6]) if v == 3]
Out[1]: [1, 3]
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

man kann ».index« auch einen Index angeben, ab wo er suchen soll:

Code: Alles auswählen

def iterindex(lst, value):
    try:
        idx = -1
        while True:
            idx = lst.index(value, idx+1)
            yield idx
    except ValueError:
        pass
print list(iterindex([1,3,4,3,6], 3))
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

haeuslermartin hat geschrieben:... so einfach und ich suche schon Tage danach ...
Ich habe mir anfangs ziemlich bald ein paar Bookmarks angelegt, unter anderen z. B. Daneben finde ich `dir()` auch immer sehr hilfreich, wenn man sich einen verlässlichen Überblick verschaffen möchte:

Code: Alles auswählen

>>> dir([])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
Damit siehst Du schon mal, welche Methoden auf ein Objekt, in diesem Fall 'ne Liste, anwendbar sind.
Wenn man dann etwas gefunden hat, das laut Namen eventuell hilfreich sein könnte, kann man sich noch den docstring anschauen:

Code: Alles auswählen

>>> print [].index.__doc__
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
In vielen Fällen kommt man damit dann schon weiter.
Oder versuche mal

Code: Alles auswählen

>>> help([])
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@haeuslermartin: In welchem Zusammenhang brauchst du das eigentlich? Mir kommt die Idee, nach den Indizes gleicher Elemente zu suchen und diese Elemente dann über Indexzugriff zu verändern bzw "alle möglichen Massnahmen damit durchzuführen", etwas eigentartig vor. Du könntest genau so gut beim Durchlaufen der Liste direkt die Elemente verändern. Wenn man diese erstmal "einsammeln" möchte:

Code: Alles auswählen

result = [elem for elem in mylist if elem == wanted_elem]
Wenn du diese Elemente nun modifizierst, dann übertragen sich die Veränderungen auch stets auf die Liste, da du hierbei auf den Originalen arbeitest und nicht etwa auf Kopien. Gefundene Indizes stellen ja letztlich auch nur so etwas ähnliches wie Verweise auf's Original dar. Nur für den Fall, dass dir dies noch nicht bewusst war und du aus diesem Grund auf Indizes arbeiten wolltest...
haeuslermartin
User
Beiträge: 66
Registriert: Sonntag 21. April 2013, 10:12

danke Euch allen,
da habe ich jetzt vorerst mal was auszuprobieren..

zur Erklärung: ich möchte, dass python in einer langen Liste von Zahlen herausfindet, welche gleich sind, wie oft die jeweils gleichen
enthalten sind, und dann noch eventuell, welchen Abstand sie haben ...
- selbst wenn ich eine Liste mit etwa 100 Elementen vor Augen habe, so ist das "per Hand" doch eine Menge Arbeit, bei der man sich leicht
verzählen kann, und die das Programm ggf. nullkommanix erledigt.
martin.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ok, dann machen Indexwerte Sinn. Zum Zählen haben Listen eine `count()` Methode, der man das gewünschte Element übergeben kann. Wenn du aber eh schon die Indizes einsammelst, dann kannst du natürlich auch `len(deine_indizes)` nehmen.
Antworten