5459 Stimmen

Zugriff auf den Index in 'for'-Schleifen

Wie kann ich auf den Index in einer for Schleife?

xs = [8, 23, 45]

for x in xs:
    print("item #{} = {}".format(index, x))

Gewünschter Output:

item #1 = 8
item #2 = 23
item #3 = 45

112 Stimmen

Beachten Sie, dass Indizes in Python bei 0 beginnen, so dass die Indizes für Ihre Beispielliste 0 bis 4 und nicht 1 bis 5 sind

68voto

Charitoo Punkte 1634

Wie in Python üblich, gibt es mehrere Möglichkeiten, dies zu tun. In allen Beispielen wird angenommen: lst = [1, 2, 3, 4, 5]

1. Mit enumerate ( als am idiomatischsten angesehen )

for index, element in enumerate(lst):
    # do the things that need doing here

Dies ist meiner Meinung nach auch die sicherste Option, da die Möglichkeit einer unendlichen Rekursion ausgeschlossen ist. Sowohl das Element als auch sein Index werden in Variablen gehalten, und es besteht keine Notwendigkeit, weiteren Code zu schreiben um auf das Element zuzugreifen.

2. Erstellen einer Variablen, die den Index enthält ( mit for )

for index in range(len(lst)):   # or xrange
    # you will have to write extra code to get the element

3. Erstellen einer Variablen, die den Index enthält ( mit while )

index = 0
while index < len(lst):
    # you will have to write extra code to get the element
    index += 1  # escape infinite recursion

4. Es gibt immer einen anderen Weg

Wie bereits erwähnt, gibt es noch andere Möglichkeiten, die hier nicht erläutert wurden und die in anderen Situationen vielleicht sogar besser geeignet sind. z.B. mit itertools.chain mit für. Es behandelt verschachtelte Schleifen besser als die anderen Beispiele.

48voto

Charlie Martin Punkte 106684

Auf altmodische Weise:

for ix in range(len(ints)):
    print(ints[ix])

Verständnis der Liste:

[ (ix, ints[ix]) for ix in range(len(ints))]

>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
... 
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
...     print(tup)
... 
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>>

5 Stimmen

Dies ist no falsch und wird in C/C++ und anderen Programmen verwendet. Es wird als nicht-pythonisch betrachtet, kann aber auch in Python verwendet werden. Wie einfache Lösungen, die es auf die Quelle herunterbrechen :+

0 Stimmen

Etwas Python Extremisten würde sagen, tu das nicht. Aber ich habe das nur gesagt, um darauf hinzuweisen, dass es mehr als einen möglichen Weg gibt

1 Stimmen

Niiice, etwas, das C-Benutzer verstehen können

48voto

Andriy Ivaneyko Punkte 18213

Zugriff auf Indizes & Leistungsbenchmarking von Ansätzen

Der schnellste Weg zum Zugriff auf die Indizes der Liste innerhalb der Schleife in Python 3.7 ist die Verwendung des Aufzählungsmethode für kleine, mittlere und große Listen.

Siehe bitte verschiedene Ansätze die verwendet werden kann, um über die Liste zu iterieren und auf den Indexwert zuzugreifen und ihre Leistungskennzahlen (was vermutlich für Sie nützlich wäre) in den nachstehenden Codebeispielen:

# Using range
def range_loop(iterable):
    for i in range(len(iterable)):
        1 + iterable[i]

# Using enumerate
def enumerate_loop(iterable):
    for i, val in enumerate(iterable):
        1 + val

# Manual indexing
def manual_indexing_loop(iterable):
    index = 0
    for item in iterable:
        1 + item
        index += 1

Siehe Leistungskennzahlen für jede Methode unten:

from timeit import timeit

def measure(l, number=10000):
    print("Measure speed for list with %d items" % len(l))
    print("range: ", timeit(lambda :range_loop(l), number=number))
    print("enumerate: ", timeit(lambda :enumerate_loop(l), number=number))
    print("manual_indexing: ", timeit(lambda :manual_indexing_loop(l), number=number))

# Measure speed for list with 1000 items
measure(range(1000))
# range:  1.161622366
# enumerate:  0.5661940879999996
# manual_indexing:  0.610455682

# Measure speed for list with 100000 items
measure(range(10000))
# range:  11.794482958
# enumerate:  6.197628574000001
# manual_indexing:  6.935181098000001

# Measure speed for list with 10000000 items
measure(range(10000000), number=100)
# range:  121.416859069
# enumerate:  62.718909123
# manual_indexing:  69.59575057400002

Das Ergebnis ist, dass die Verwendung von enumerate Methode ist die schnellste Methode zur Iteration, wenn der Index benötigt wird.

Nachfolgend finden Sie einige nützliche Links:

7 Stimmen

"Die Lesbarkeit zählt" Der Geschwindigkeitsunterschied im kleinen <1000-Bereich ist unbedeutend. Er ist 3 % langsamer bei einer bereits geringen Zeitmetrik.

0 Stimmen

Wie wäre es, die Antwort auf Python 3 zu aktualisieren?

2 Stimmen

@Georgy macht Sinn, auf python 3.7 enumerate ist totaler Gewinner :)

40voto

Kofi Punkte 828

Sie können verwenden enumerate und betten Ausdrücke in String-Literale ein, um die Lösung zu erhalten.

Dies ist ein einfacher Weg:

a=[4,5,6,8]
for b, val in enumerate(a):
    print('item #{} = {}'.format(b+1, val))

22voto

rassa45 Punkte 3400

Zunächst einmal werden die Indizes von 0 bis 4 sein. Programmiersprachen beginnen mit der Zählung bei 0; vergessen Sie das nicht, sonst werden Sie eine Ausnahme wegen Indexüberschreitung bekommen. Alles, was Sie in der for-Schleife brauchen, ist eine Variable, die von 0 bis 4 zählt, etwa so:

for x in range(0, 5):

Beachten Sie, dass ich 0 bis 5 geschrieben habe, weil die Schleife eine Zahl vor dem Maximum aufhört :)

Um den Wert eines Indexes zu erhalten, verwenden Sie

list[index]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X