Jak uzyskać dostęp do indeksu w pętli for jak poniżej?

ints = [8, 23, 45, 12, 78]
for i in ints:
    print('item #{} = {}'.format(???, i))

Chcę uzyskać ten wynik:

item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78

Kiedy pętlam go za pomocą pętli for, jak mam uzyskać dostęp do indeksu pętli, od 1 do 5 w tym przypadku?

4425
Joan Venge 7 luty 2009, 01:47

19 odpowiedzi

Najlepsza odpowiedź

Korzystając z dodatkowej zmiennej stanu, takiej jak zmienna indeksu (którą normalnie wykorzystałeś w językach, takich jak C lub PHP), jest uważany za nie-Pythonic.

Im lepszą opcją jest użycie wbudowanej funkcji PEP 279 dla więcej.

6657
Peter Mortensen 17 wrzesień 2016, 10:13

Korzystanie z pętli, jak mam uzyskać dostęp do indeksu pętli od 1 do 5 w tym przypadku?

Użyj enumerate, aby uzyskać indeks z elementem, który jest itera:

for index, item in enumerate(items):
    print(index, item)

I zauważ, że indeksy Pythona zaczynają się od zera, więc uzyskasz 0 do 4 z powyższym. Jeśli chcesz liczyć, 1 do 5, zrób to:

for count, item in enumerate(items, start=1):
    print(count, item)

UNIDYOMATIC CONTROL FIND.

CO PYTAJ, ŻE JEST PITHONION EQUALENT z poniższych, który jest algorytm większości programistów języków niższego poziomu:

index = 0            # Python's indexing starts at zero
for item in items:   # Python's for loops are a "for each" loop 
    print(index, item)
    index += 1

Lub w językach, które nie mają dla każdej pętli:

index = 0
while index < len(items):
    print(index, items[index])
    index += 1

Lub czasami częściej (ale unidiomatycznie) znalezione w Pythonie:

for index in range(len(items)):
    print(index, items[index])

Użyj funkcji wyliczającej

Python's kanoniczne przykład różnicy między kodem, który jest idiomatyczny Pythona i kod, który nie jest. Kod IDiomatyczny jest wyrafinowany (ale nie skomplikowany) pyton, napisany w sposób, który miał być używany. Kod idiomatyczny jest oczekiwany przez projektantów języka, co oznacza, że zwykle ten kod nie jest po prostu bardziej czytelny, ale także bardziej wydajny.

Uzyskanie liczby

Nawet jeśli nie potrzebujesz indeksów, jak idziesz, ale potrzebujesz liczby iteracji (czasami pożądane), możesz zacząć od 1, a ostatni numer będzie twoją liczbą.

for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

Liczba wydaje się być bardziej, co zamierzasz prosić o (w przeciwieństwie do indeksu), kiedy powiedziałeś, że chcesz od 1 do 5.


Rozbijanie go - krok po kroku wyjaśnienie

Aby przełamać te przykłady, powiedzmy, że mamy listę przedmiotów, które chcemy iterować z indeksem:

items = ['a', 'b', 'c', 'd', 'e']

Teraz przekazujemy to, aby wyliczyć, tworząc wyliczający obiekt:

enumerate_object = enumerate(items) # the enumerate object

Możemy wyciągnąć pierwszy przedmiot z tego iterable, który dostaniemy w pętli z funkcją next:

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

I widzimy, że dostajemy krotkę 0, pierwszego indeksu i 'a', pierwszego elementu:

(0, 'a')

Możemy użyć tego, co nazywa się jako "sekwencja rozpakowań "Wyodrębnij elementy z dwóch krotki:

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

A kiedy inspektujemy index, odnosimy, że odnosimy się do pierwszego indeksu, 0, a {x1}} odnosi się do pierwszego elementu, 'a'.

>>> print(index)
0
>>> print(item)
a

Wniosek

  • Indeksy Pythona zaczynają się od zera
  • Aby uzyskać takie indeksy z iterabe, jak toter, użyj funkcji wyliczającej
  • Korzystanie z wyliczania w sposób idiomatyczny (wraz z Tuple rozpakowywanie) tworzy kod, który jest bardziej czytelny i utrzymujący:

Więc zrób to:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)
876
Aaron Hall 9 marzec 2018, 15:37

Jest całkiem proste, aby uruchomić go z 1 innego niż 0:

for index, item in enumerate(iterable, start=1):
   print index, item

Uwaga

Ważna wskazówka, choć trochę wprowadzająca w błąd od index będzie tuple (idx, item) tutaj. Dobrze iść.

170
ShadowRanger 6 październik 2020, 18:24
for i in range(len(ints)):
   print i, ints[i]
95
David Hanak 6 luty 2009, 22:49

Podobnie jak norma w Pythonie, istnieje kilka sposobów na to zrobić. We wszystkich przykładach zakładają: lst = [1, 2, 3, 4, 5]

1. Używanie wyliczania ( uważane za najbardziej idiomatyczne )

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

Jest to również najbezpieczniejsza opcja moim zdaniem, ponieważ szansa na wejście do nieskończonej rekurencji została wyeliminowana. Zarówno przedmiot, jak i jego indeks są przechowywane w zmiennych i nie ma potrzeby napisania dalszego kodu, aby uzyskać dostęp do elementu.

2. Tworzenie zmiennej do przechowywania indeksu ( przy użyciu for )

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

3. Tworzenie zmiennej do przechowywania indeksu ( przy użyciu while )

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

4. Zawsze jest inny sposób

Jak wyjaśniono wcześniej, istnieją inne sposoby, aby to zrobić, które nie zostały tutaj wyjaśnione i mogą nawet stosować więcej w innych sytuacjach. e.g przy użyciu itertools.chain za pomocą. Uchwytuje zagnieżdżone pętle lepsze niż inne przykłady.

50
jamylak 10 luty 2018, 20:05

Po staremu:

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

Rozumienie listy:

[ (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)
>>> 
30
Charlie Martin 6 luty 2009, 22:57

Przede wszystkim indeksy będą od 0 do 4. Języki programowania zaczynają liczyć od 0; Nie zapomnij, że lub natkniesz się na indeks niezbojowy wyjątek. Wszystko, czego potrzebujesz w pętli, jest zmienną liczącą od 0 do 4 jak:

for x in range(0, 5):

Należy pamiętać, że napisałem 0 do 5, ponieważ pętla zatrzymuje jeden numer przed maxem. :)

Aby uzyskać wartość użycia indeksu

list[index]
14
Thorsten S. 25 maj 2015, 23:05

Oto, co otrzymujesz, aby uzyskać dostęp do indeksu w for pętle:

{x0}}

items = [8, 23, 45, 12, 78]

for i in enumerate(items):
    print("index/value", i)

Wynik:

# index/value (0, 8)
# index/value (1, 23)
# index/value (2, 45)
# index/value (3, 12)
# index/value (4, 78)

{x0}}

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i, "for value", val)

Wynik:

# index 0 for value 8
# index 1 for value 23
# index 2 for value 45
# index 3 for value 12
# index 4 for value 78

{x0}}

items = [8, 23, 45, 12, 78]

for i, val in enumerate(items):
    print("index", i)

Wynik:

# index 0
# index 1
# index 2
# index 3
# index 4
14
Community 20 czerwiec 2020, 09:12

Zgodnie z tą dyskusją: http://bytes.com/topic/Python / Odpowiedzi / 464012-obiekty-lista

Loop Counter Iteration.

Obecny idiom do zapętlenia nad indeksami wykorzystuje wbudowany range funkcji:

for i in range(len(sequence)):
    # work with index i

Zapętlanie się na obu elementach i wskaźników można osiągnąć albo przez starego idiomu, albo za pomocą wbudowanej funkcji Nowy zip:

for i in range(len(sequence)):
    e = sequence[i]
    # work with index i and element e

Lub

for i, e in zip(range(len(sequence)), sequence):
    # work with index i and element e

Via http://www.Python.org/dev/peps/pep-0212/.

12
Georgy 22 maj 2019, 14:29

Możesz to zrobić z tym kodem:

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value

Użyj tego kodu, jeśli chcesz zresetować wartość indeksu na końcu pętli:

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value
    if index >= len(ints)-1:
        index = 0
11
Liam 26 maj 2015, 10:39

Najlepszym rozwiązaniem dla tego problemu jest używanie funkcji Exumeate In-budynek Python.
.. wylicz powrót krotka
Pierwsza wartość to indeks
Druga wartość to element tablicy w tym indeksie

In [1]: ints = [8, 23, 45, 12, 78]

In [2]: for idx, val in enumerate(ints):
   ...:         print(idx, val)
   ...:     
(0, 8)
(1, 23)
(2, 45)
(3, 12)
(4, 78)
10
Anurag Misra 24 sierpień 2017, 06:15

Gdybym miał iterować {x0}}

for i, num in enumerate(nums, start=1):
    print(i, num)

Lub zdobądź długość jako l = len(nums)

for i in range(1, l + 1):
    print(i, nums[i])
10
so2 26 maj 2020, 01:51

W pytaniu piszesz "Jak uzyskać dostęp do indeksu pętli, od 1 do 5 w tym przypadku?"

Jednak indeks listy biegnie od zera. Więc musimy wiedzieć, czy to, co właściwie chcesz, jest indeksem i elementem dla każdego elementu na liście, czy też naprawdę chcesz, aby liczby począwszy od 1. na szczęście w Pythonie, łatwo jest zrobić albo obu.

Najpierw, aby wyjaśnić, funkcja enumerate iteracyjnie zwraca indeks i odpowiedni element dla każdego elementu na liście.

alist = [1, 2, 3, 4, 5]

for n, a in enumerate(alist):
    print("%d %d" % (n, a))

Wyjście dla powyższego jest wtedy,

0 1
1 2
2 3
3 4
4 5

Zauważ, że indeks działa od 0. Ten rodzaj indeksowania jest powszechny wśród nowoczesnych języków programowania, w tym Python i C.

Jeśli chcesz, aby Twoja pętla obejmowała część listy, możesz użyć standardowej składni Python dla części listy. Na przykład, aby pętli z drugiego elementu na liście, ale nie wliczając ostatniego elementu, można użyć

for n, a in enumerate(alist[1:-1]):
    print("%d %d" % (n, a))

Pamiętaj, że po raz kolejny indeks wyjściowy działa od 0,

0 2
1 3
2 4

Który przynosi nas do przełącznika start=n dla enumerate(). To po prostu przesadza w indeksie, możesz równoważnie po prostu dodać numer do indeksu wewnątrz pętli.

for n, a in enumerate(alist, start=1):
    print("%d %d" % (n, a))

Dla którego wyjście jest

1 1
2 2
3 3
4 4
5 5
9
Georgy 22 maj 2019, 15:10

Jeśli na liście nie ma duplikatu:

for i in ints:
    indx = ints.index(i)
    print(i, indx)
6
Georgy 22 maj 2019, 15:02

Możesz też spróbować tego:

data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
      a = (i, str(item).split('.'))
      x.append(a)
for index, value in x:
     print(index, value)

Wynik jest

0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']
5
Ashok Kumar Jayaraman 7 luty 2018, 14:04

Możesz użyć metody index

ints = [8, 23, 45, 12, 78]
inds = [ints.index(i) for i in ints]

edytuj Podświetlony w komentarzu, że ta metoda nie działa, jeśli istnieją duplikaty w ints, metoda poniżej powinna działać dla dowolnych wartości w ints:

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup[0] for tup in enumerate(ints)]

Lub alternatywnie

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup for tup in enumerate(ints)]

Jeśli chcesz uzyskać zarówno indeks, jak i wartość w ints jako lista kanałów.

Wykorzystuje metodę enumerate w wybranej odpowiedzi na to pytanie, ale z rozumieniem listy, dzięki czemu szybciej przy mniejszym kodzie.

3
PyRsquared 31 maj 2018, 06:09

Aby wydrukować krotkę (indeks, wartość) w rozumieniu listy za pomocą pętli for:

ints = [8, 23, 45, 12, 78]
print [(i,ints[i]) for i in range(len(ints))]

Wynik:

[(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]
1
lola 24 kwiecień 2018, 10:53

Serwuje to wystarczająco dobrze:

list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3]
for x in list1:
    print('index:', list1.index(x), 'value:', x)
0
Challenger5 15 maj 2018, 05:41