Pristup indeksu u petlji "za"?

Kako mogu pristupiti samom indeksu za popis poput sljedećeg?

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

Kad sam proći kroz to s for petlju, kako mogu pristupiti petlji indeksa, od 1 do 5 u ovom slučaju?

2850
07 февр. postavila Joan Venge 7. veljače 2009-02-07 01:47 '09 u 1:47 2009-02-07 01:47
@ 23 odgovora

Korištenje dodatne varijable stanja, kao što je indeksna varijabla (koju obično koristite na jezicima kao što je C ili PHP), smatra se ne-pitonskim.

Najbolje je koristiti ugrađenu funkciju enumerate() , dostupnu u oba Pythona 2 i 3:

 for idx, val in enumerate(ints): print(idx, val) 

Pročitajte više o PEP 279 .

4911
07 февр. Odgovor dao Mike Hordecki 07. veljače. 2009-02-07 01:52 '09 u 1:52 am 2009-02-07 01:52

Koristeći petlju for, kako pristupiti indeksu petlje, od 1 do 5 u ovom slučaju?

Koristite enumerate da biste dobili indeks s stavkom kada se ponovi:

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

I imajte na umu da Python indeksi počinju od nule, tako da ćete dobiti od 0 do 4 s gore navedenim. Ako želite da brojač od 1 do 5 to učini:

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

Unidiomatski tijek kontrole

Ono što tražite je pythonic ekvivalent od sljedećeg: ovo je algoritam koji će većina programera nižih jezika koristiti:

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

Ili na jezicima za koje nema petlje:

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

ili ponekad češće (ali uniometrically) naći u Python:

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

Koristite funkciju nabrajanja

Pythonova funkcija enumerate smanjuje vidljive smetnje skrivanjem obračuna indeksa i inkapuliranjem iterabilnosti u drugi iterabilni ( enumerate objekt), koji daje dvoklasni indeks i element koji će biti osiguran izvornim iterabilnim. Izgleda ovako:

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

Ovaj primjer koda je prilično dobar u kanonskom primjeru razlike između koda koji je idiotski Python i koda koji nije. Idiomatski kod je složen (ali ne i složen) Python, napisan na način na koji je trebao biti korišten. Idiomatski kod se očekuje od strane programera jezika, što znači da obično ovaj kod nije samo čitljiviji, nego i učinkovitiji.

Prijem fakture

Čak i ako vam nisu potrebni indeksi kada idete, ali morate brojiti ponavljanje (ponekad poželjno), možete početi s 1 a konačni broj će biti vaš rezultat.

 for count, item in enumerate(items, start=1): # default is zero print(item) print('there were {0} items printed'.format(count)) 
border=0

Čini se da je grafikon više od onoga što namjeravate pitati (za razliku od indeksa), kada ste rekli da želite od 1 do 5.


Uništenje - objašnjenje korak po korak

Da bismo razdvojili ove primjere, recimo da imamo popis stavki koje želimo ponoviti pomoću indeksa:

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

Sada prosljeđujemo ovu iteraciju na popis, stvarajući objekt nabrajanja:

 enumerate_object = enumerate(items) # the enumerate object 

Prvi element možemo izvući iz ovog iterabilnog, koji bismo dobili u petlji sa next funkcijom:

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

I vidimo da dobivamo tuple 0 , prvi indeks i 'a' , prvi element:

 (0, 'a') 

možemo upotrijebiti ono što se naziva " raspakiranje slijedova " kako bismo izdvojili elemente iz ove dvije točke:

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

i kada provjeravamo index , nalazimo da se odnosi na prvi indeks, 0, a item odnosi na prvi element 'a' .

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

zaključak

  • Python indeksi počinju od nule
  • Za dobivanje tih indeksa iz iteracije, kada iterirate kroz njega, koristite funkciju enumeracije
  • Korištenje enumova u idiomatskom načinu rada (zajedno s raspakiranjem torka) stvara kod koji je čitljiviji i podržan:

Zato učinite sljedeće:

 for index, item in enumerate(items, start=0): # Python indexes start at zero print(index, item) 
593
21 янв. odgovor je dao Aaron Hall 21. siječnja 2015-01-21 20:11 '15 u 20:11 2015-01-21 20:11

Vrlo je jednostavno početi s 1 osim 0 :

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

bilješka

Važan nagovještaj, iako pomalo zbunjujući, budući da će index biti tuple (idx, item) . Dobro je otići.

111
27 мая '14 в 13:04 2014-05-27 13:04 odgovor je dao Clayton 27. svibanj '14 u 13:04 2014-05-27 13:04
 for i in range(len(ints)): print i, ints[i] 
76
07 февр. Odgovor dao David Hanak 07. \ T 2009-02-07 01:49 '09 u 1:49 2009-02-07 01:49

Kao iu Pythonu, postoji nekoliko načina za to. U svim primjerima pretpostavimo: lst = [1, 2, 3, 4, 5]

1. Upotreba nabrajanja (koja se smatra najidiomatičnijom)

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

To je također najsigurnija opcija, po mom mišljenju, jer je eliminirana vjerojatnost prijelaza na beskonačnu rekurziju. Oba elementa i njegov indeks pohranjeni su u varijablama i nema potrebe za pisanjem dodatnog koda za pristup elementu.

2. Izradite varijablu za pohranu indeksa (upotrebljavajući for )

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

3. Izradite varijablu za pohranjivanje indeksa (koristeći while )

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

4. Uvijek postoji drugi način.

Kao što je ranije objašnjeno, postoje drugi načini da se to učini, a koji ovdje nisu objašnjeni, a mogu se čak i primjenjivati ​​u drugim situacijama. na primjer, pomoću itertools.chain s za. On bolje rukuje ugniježđene petlje od drugih primjera.

39
15 авг. odgovor dati Charitoo 15 aug. 2017-08-15 05:17 '17 u 5:17 2017-08-15 05:17

Starinski način:

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

Računovodstveni popis:

 [ (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) >>> 
23
07 февр. Odgovor daje Charlie Martin 07. veljače. 2009-02-07 01:52 '09 u 1:52 am 2009-02-07 01:52

Najbrži način pristupanja indeksnim popisima unutar petlje u Pythonu 2.7 je korištenje metode raspona za male popise i popis metoda za srednje i velike popise.

Pogledajte različite pristupe koje možete koristiti za ponavljanje popisa i indeksa pristupa i njihove pokazatelje uspješnosti (za koje mislim da će vam biti korisne) u primjerima koda u nastavku:

 from timeit import timeit # Using range def range_loop(iterable): for i in range(len(iterable)): 1 + iterable[i] # Using xrange def xrange_loop(iterable): for i in xrange(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 

Pogledajte Pokazatelji izvedbe za svaku sljedeću metodu:

 from timeit import timeit def measure(l, number=10000): print "Measure speed for list with %d items" % len(l) print "xrange: ", timeit(lambda :xrange_loop(l), number=number) 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(range(1000)) # Measure speed for list with 1000 items # xrange: 0.758321046829 # range: 0.701184988022 # enumerate: 0.724966049194 # manual_indexing: 0.894635915756 measure(range(10000)) # Measure speed for list with 100000 items # xrange: 81.4756360054 # range: 75.0172479153 # enumerate: 74.687623024 # manual_indexing: 91.6308541298 measure(range(10000000), number=100) # Measure speed for list with 10000000 items # xrange: 82.267786026 # range: 84.0493988991 # enumerate: 78.0344707966 # manual_indexing: 95.0491430759 

Kao rezultat toga, korištenje metode range najbrže je za popis 1000 stavki. Za popis s veličinom od> 10.000 stavki enumerate pobjednika.

U nastavku dodajte neke korisne veze:

18
04 авг. odgovor dao Andriy Ivaneyko 04 aug. 2016-08-04 12:49 '16 u 12:49 2016-08-04 12:49

Ne znam hoće li sljedeće biti pythonic ili ne, ali koristi Python funkciju i enumerate indeks i vrijednost.

 int_list = [8, 23, 45, 12, 78] for index, value in enumerate(int_list): print(index, value) 

zaključak:

 0 8 1 23 2 45 3 12 4 78 
16
28 окт. odgovor dao user2912389 28. listopada 2013-10-28 21:17 '13 u 21:17 2013-10-28 21:17
 ints = [9, 23, 45, 12, 78] ints.extend([1,2,3,4,5,6,7,8]) for idx, val in enumerate(ints): print(idx,val) 

Tako možete proširiti popis. Proširenje znači da možete dodati više vrijednosti odjednom.

Da biste dodali ovaj popis, morate napisati kôd u nastavku:

 ints = [9, 23, 45, 12, 78] ints.append([1]) for idx, val in enumerate(ints): print(idx,val) 

Tako možete dodati jednu vrijednost odjednom. Ako napišete ints.append([1]) , tada će se stvoriti dodatni popis za tu stavku.

15
05 февр. odgovor dao iamjayp 05. veljače. 2015-02-05 20:28 '15 u 20:28 2015-02-05 20:28

Prije svega, indeksi će biti od 0 do 4. Programski jezici počinju od 0; ne zaboravite na ovo ili ćete naići na iznimku iznimke. Sve što trebate u petlji for je varijabla koja broji od 0 do 4 kako slijedi:

 for x in range(0, 5): 

Imajte na umu da sam napisao od 0 do 5, jer ciklus zaustavlja jedan broj na maks.

Da biste dobili vrijednost indeksa, upotrijebite

 list[index] 
11
25 мая '15 в 18:08 2015-05-25 18:08 odgovor je dao ytpillai 25. svibnja '15 u 18:08 2015-05-25 18:08

To možete učiniti s ovim kôdom:

 ints = [8, 23, 45, 12, 78] index = 0 for value in (ints): index +=1 print index, value 

Koristite ovaj kôd ako trebate resetirati vrijednost indeksa na kraju petlje:

 ints = [8, 23, 45, 12, 78] index = 0 for value in (ints): index +=1 print index, value if index >= len(ints)-1: index = 0 
9
25 мая '15 в 18:26 2015-05-25 18:26 odgovor je dao Liam 25. svibnja '15. u 18:26 2015-05-25 18:26

U skladu s ovom raspravom: http://bytes.com/topic/python/answers/464012-objects-list-index

Petlja ponavljanja

Trenutni idiom za ciklizaciju pomoću indeksa koristi ugrađenu funkciju "raspona":

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

Biciklizam na oba elementa i indeksa može se postići ili starim idiomom ili korištenjem nove ugrađene zip funkcije [2]:

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

ili

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

putem http://www.python.org/dev/peps/pep-0212/

9
05 мая '12 в 10:10 2012-05-05 10:10 odgovor je dao thinker007 05 Svibanj '12 u 10:10 2012-05-05 10:10

Najbolje rješenje za ovaj problem je korištenje python ugrađene enumerije funkcije.
enumeracija vraća tuple
prva vrijednost indeksa
drugu vrijednost elementa niza s ovim indeksom

 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) 
8
24 авг. odgovor je dao Anurag Misra 24 aug. 2017-08-24 09:15 '17 u 9:15 am 2017-08-24 09:15

Ako popis nema dvostruku vrijednost:

 for i in ints: indx = ints.index(i) print(i,indx) 

Inače, koristite enumerate .

 for counter, value in enumerate(ints): print(counter, value) 

ILI koristite niže:

 for counter in range(len(ints)): print(counter, ints[counter]) 
5
10 июня '18 в 6:59 2018-06-10 06:59 Odgovor je dao RIshu 10. lipnja 18.06. U 6:59 sati. 2018-06-10 06:59

U vašem pitanju pišete "kako mogu dobiti pristup indeksu petlje, od 1 do 5 u ovom slučaju?"

Međutim, indeks za popis teče od nule. Pa onda moramo znati je li ono što doista želite indeks i element za svaki element na popisu, ili stvarno želite da brojevi počinju s 1. Srećom, u pythonu je lako napraviti jedan ili oboje.

Prvo, za pojašnjenje, funkcija nabrajanja, iterativno vraća indeks i odgovarajući element za svaki element na popisu.

 alist = [ 1, 2, 3, 4, 5 ] for n,a in enumerate(alist): print( "%d %d"%(n,a) ) 

Zaključak za gore navedeno

 0 1 1 2 2 3 3 4 4 5 

Imajte na umu da indeks radi od 0. Ova vrsta indeksiranja je uobičajena među modernim programskim jezicima, uključujući python i c.

Ako želite da petlja obuhvaća dio popisa, za dio popisa možete koristiti standardnu ​​python sintaksu. Na primjer, da biste petlju od druge stavke na popisu, ali ne uključujući posljednju stavku, možete upotrijebiti

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

Napominjemo da indeks izlaza ponovno radi od 0,

 0 2 1 3 2 4 

To dovodi do start = n prekidača za popisivanje (). To samo pomiče indeks, možete ekvivalentno samo dodati broj indeksu unutar petlje.

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

za koji izlaz

 1 1 2 2 3 3 4 4 5 5 
3
15 авг. odgovor je dao drM 15 aug. 2018-08-15 20:52 '18 u 20:52 2018-08-15 20:52

Možete pokušati i sljedeće:

 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) 

izlaz

 0 ['itemA', 'ABC'] 1 ['itemB', 'defg'] 2 ['itemC', 'drug'] 3 ['itemD', 'ashok'] 
3
07 февр. Odgovor daje Ashok Kumar Jayaraman 07. veljače. 2018-02-07 17:04 '18 u 17:04 2018-02-07 17:04

Možete koristiti metodu index

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

EDIT Posvećeno komentarima da ova metoda ne radi, ako postoje duplikati u ints , metoda ispod trebala bi raditi za sve vrijednosti u ints :

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

Ili alternativno

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

ako želite dobiti i indeks i vrijednost u ints kao popis tuples.

Ona koristi metodu enumerate u odabranom odgovoru na ovo pitanje, ali s razumijevanjem popisa, što ga čini bržim s manje koda.

1
31 мая '18 в 0:34 2018-05-31 00:34 odgovor je dan killerT2333 31. svibnja '18 u 0:34 2018-05-31 00:34

Ako ponovim nums = [1,2,3,4,5], učinio bih

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

Ili dobiti duljinu kao l = len (nums)

 for i, num in range(1, l + 1): print(i, nums[i]) 
1
04 июня '18 в 5:10 2018-06-04 05:10 odgovor je dao Ankur Kothari 04. lipnja u 5.10 sati 2018-06-04 05:10

To se također može učiniti metodom index() .

 for i in ints: print(ints.index(i), i) 

Ovdje indeksiranje počinje od 0. Ali ako ga trebate pokrenuti iz 1, dodajte 1 u index() metodu kako slijedi

 for i in int: print(int.index(i) + 1, i) 
1
30 нояб. Odgovor je dao Loochie 30. studenog 2018-11-30 12:25 '18 u 12:25 sati 2018-11-30 12:25

Evo što dobivate kada pristupite indeksima for cikluse:

for я in enumerate(items): print(i)

2019

17 янв. odgovor ARGeo 17. siječnja 2019-01-17 04:07 '19 u 16:07 sati 2019-01-17 04:07

Za ispis tuple (index, value) u smislu popisa pomoću petlje for :

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

zaključak:

 [(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)] 
0
24 апр. odgovor je dao lola 24. travnja 2018-04-24 13:53 '18 u 13:53 sati 2018-04-24 13:53

To dobro služi svrsi:

 list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3] for x in list1: print('index:', list1.index(x), 'value:', x) 
-1
24 апр. odgovor daje Sumit Kumar 24. travnja. 2018-04-24 13:45 '18 u 13:45 sati 2018-04-24 13:45

Primili ste niz odgovora koji objašnjavaju enumerate , ali ako vam je potreban samo indeks za pristup odgovarajućim unosima u dva popisa, postoji još jedan način koji je čišći i jednostavniji u Pythonu 3: zip .

Na primjer, ako koristite indeks za povlačenje odgovarajućih imena za brojeve na popisu, možete to učiniti na sljedeći način:

 ints = [8, 23, 45, 12, 78] names = ["John", "Sue", "Johannes", "Patel", "Ian"] for int, name = zip(ints, names): print("{} - {}".format(name, int) 

To će dovesti do toga

 8 - John 23 - Sue 45 - Johannes 12 - Patel 78 - Ian 
-1
14 февр. odgovor je dao Gary R. 14. veljače. 2018-02-14 22:20 '18 u 22:20 sati 2018-02-14 22:20

Ostala pitanja o oznakama ili Postavi pitanje