Prieigos indeksas „už“ kilpas?

Kaip pasiekti patį indeksą, pvz., Tokį sąrašą?

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

Kai aš einu per jį su kilpa, kaip aš galiu pasiekti kilpos indeksą nuo 1 iki 5 šiuo atveju?

2850
07 февр. nustatė Joan Venge , vasario 7 d 2009-02-07 01:47 '09 ne 1:47 2009-02-07 01:47
@ 23 atsakymai

Naudojant papildomą būsenos kintamąjį, pvz., Indekso kintamąjį (kurį paprastai naudojate tokiose kalbose kaip C arba PHP), laikoma ne pythoninė.

Geriausias variantas yra naudoti integruotą funkciją enumerate() , esančią 2 ir 3 „Python“:

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

Skaityti daugiau apie PEP 279 .

4911
07 февр. Atsakymas, kurį pateikė Mike Hordecki 07 vasaris 2009-02-07 01:52 '09 ne 1:52 am. 2009-02-07 01:52

Kaip naudoti kilpą, kaip prieiti prie kilpos indekso, nuo 1 iki 5 šiuo atveju?

Naudokite enumerate kad gautumėte indeksą su elementu, kai jis kartojamas:

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

Atkreipkite dėmesį, kad „Python“ indeksai pradedami skaičiuoti nuo nulio, taigi jūs gausite nuo 0 iki 4 aukščiau. Jei norite, kad skaitiklis nuo 1 iki 5:

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

Unidiomatinis valdymo srautas

Tai, ko prašote, yra pythoninis ekvivalentas: tai yra algoritmas, kurį naudos dauguma žemesnio lygio kalbų programuotojų:

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

Arba kalbomis, kurioms nėra kilpos:

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

arba kartais dažniau (bet unometriškai) rasti „Python“:

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

Naudokite skaičiavimo funkciją

„Python“ enumerate funkcija sumažina matomą netvarką slėpdama indeksų apskaitą ir įterpdama pasikartojamumą į kitą iterable ( enumerate objektą), kuris duoda dviejų pozicijų indekso eilutę ir elementą, kurį pateiks originalas. Tai atrodo taip:

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

Šis kodo pavyzdys yra gana geras kanoniniame pavyzdyje, kai skirtumas tarp kodo, kuris yra idiomatinis Pythonas, ir kodo, kuris nėra. Idiomatinis kodas yra sudėtingas (bet ne sudėtingas) Python, parašytas kaip jis turėjo būti naudojamas. Idiomatinį kodą tikisi kalbos kūrėjai, o tai reiškia, kad paprastai šis kodas yra ne tik aiškesnis, bet ir efektyvesnis.

Sąskaitos faktūros gavimas

Net jei jums nereikia indeksų, kai jūs einate, bet jums reikia suskaičiuoti iteracijas (kartais pageidautinas), galite pradėti nuo 1 o galutinis skaičius bus jūsų rezultatas.

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

Atrodo, kad grafikas yra daugiau nei tai, ką ketinate paklausti (priešingai nei indeksas), kai pasakėte, kad norite nuo 1 iki 5.


Sunaikinimas - žingsnis po žingsnio paaiškinimas

Jei norite suskaidyti šiuos pavyzdžius, tarkime, kad turime sąrašą elementų, kuriuos norime naudoti, naudodami indeksą:

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

Dabar mes perduodame šią iteraciją į skaičiavimą, sukuriant skaičiavimo objektą:

 enumerate_object = enumerate(items) # the enumerate object 

Pirmąjį elementą galime ištraukti iš šio iterable, kurį mes patektume į kilpą su next funkcija:

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

Ir matome, kad gauname 0 eilutę, pirmąjį indeksą ir 'a' , pirmąjį elementą:

 (0, 'a') 

galime naudoti tai, kas vadinama „ sekos išpakavimu “, kad ištrauktume elementus iš šio dviejų paketų:

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

ir kai mes tikriname index , matome, kad jis susijęs su pirmuoju indeksu, 0, o item - pirmasis 'a' . elementas.

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

Išvada

  • Python indeksai prasideda nuo nulio
  • Norėdami gauti šiuos rodiklius iš iteracijos, kai ją kartojate, naudokite skaičiavimo funkciją
  • Naudojant „Enums“ idiomatiniu režimu (kartu su paketo išpakavimu) sukuriamas labiau skaitomas ir palaikomas kodas:

Taigi atlikite šiuos veiksmus:

 for index, item in enumerate(items, start=0): # Python indexes start at zero print(index, item) 
593
21 янв. atsakymą pateikė Aaron Hall 21 sausis 2015-01-21 20:11 '15 - 20:11 2015-01-21 20:11

Tai gana paprasta pradėti nuo 1 kito nei 0 :

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

Pastaba

Svarbus užuominas, nors ir šiek tiek klaidinantis, nes index bus tuple (idx, item) . Geras eiti.

111
27 мая '14 в 13:04 2014-05-27 13:04 atsakymą pateikė Clayton gegužės 27 d. 14, 13:04 2014-05-27 13:04
 for i in range(len(ints)): print i, ints[i] 
76
07 февр. David Hanak atsakymas 07 Vas 2009-02-07 01:49 '09 ne 1:49 am. 2009-02-07 01:49

Kaip ir Python, tai galima padaryti keliais būdais. Visuose pavyzdžiuose, tarkime: lst = [1, 2, 3, 4, 5]

1. Naudojant skaičiavimą (laikomas labiausiai idiomatiniu)

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

Tai, mano nuomone, taip pat yra saugiausias variantas, nes tikimybė pereiti prie begalinės rekursijos yra pašalinta. Abu elementai ir jo indeksas yra saugomi kintamuosiuose ir nereikia rašyti jokių papildomų kodų, kad galėtumėte pasiekti elementą.

2. Sukurkite kintamąjį, kad išsaugotumėte indeksą (naudodami)

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

3. Sukurkite kintamąjį, kad išsaugotumėte indeksą (naudojant)

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

4. Visada yra kitas būdas.

Kaip paaiškinta anksčiau, yra ir kitų būdų tai padaryti, kurie čia nebuvo paaiškinti, ir jie netgi gali būti taikomi kitose situacijose. pavyzdžiui, naudodami itertools.chain . Ji geriau nei kiti pavyzdžiai tvarko įdėtines kilpas.

39
15 авг. atsakymas suteiktas Charitoo 15 rug . 2017-08-15 05:17 '17, 5:17 2017-08-15 05:17

Senoviškas būdas:

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

Apskaitos sąrašas:

 [ (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 февр. Atsakymą pateikė Charlie Martin 07 Feb. 2009-02-07 01:52 '09 ne 1:52 am. 2009-02-07 01:52

Greičiausias būdas pasiekti sąrašo indeksus „ Python 2.7“ ciklo viduje yra naudoti mažų sąrašų diapazono metodą ir išvardyti metodą vidutinio ir didelio dydžio sąrašams.

Žr. Įvairius metodus, kuriuos galite naudoti, kad kartotumėte per sąrašą ir prieigos indeksą, ir jų veiklos rodikliai (kurie, manau, bus naudingi jums) toliau pateiktuose kodų pavyzdžiuose:

 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 

Žr. Kiekvieno metodo našumo rodiklius:

 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 

Dėl to range metodas yra greičiausias 1000 elementų sąrašas. Jei sąraše yra> 10000 elementų, išvardykite nugalėtoją.

Pridėti žemiau naudingas nuorodas:

18
04 авг. atsakymas, kurį pateikė Andriy Ivaneyko 04 rug . 2016-08-04 12:49 '16 at 12:49 2016-08-04 12:49

Nežinau, ar toks yra pythoninis, ar ne, bet jis naudoja Python funkciją ir enumerate indeksą ir vertę.

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

Išvada:

 0 8 1 23 2 45 3 12 4 78 
16
28 окт. atsakymas, kurį pateikė user2912389 Oct 28 2013-10-28 21:17 '13, 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) 

Taigi galite išplėsti sąrašą. Išplėtimas reiškia, kad vienu metu galite pridėti kelias reikšmes.

Jei norite pridėti šį sąrašą, turite parašyti toliau pateiktą kodą:

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

Taigi vienu metu galite pridėti vieną vertę. Jei rašote ints.append([1]) , tada bus sukurtas papildomas šio elemento sąrašas.

15
05 февр. atsakymas duotas iamjayp 05 Feb. 2015-02-05 20:28 '15 at 20:28 2015-02-05 20:28

Visų pirma, indeksai bus nuo 0 iki 4. Programavimo kalbos prasideda nuo 0; nepamirškite apie tai arba susidursite su išimtimi. Viskas, ko jums reikia, yra kintamasis, skaičiuojant nuo 0 iki 4 taip:

 for x in range(0, 5): 

Atminkite, kad parašiau nuo 0 iki 5, nes ciklas sustabdo vieną numerį iki maks. :)

Norėdami gauti indekso vertę, naudokite

 list[index] 
11
25 мая '15 в 18:08 2015-05-25 18:08 atsakymą pateikė „ ytpillai “ gegužės 15-15 dienomis 18:08 2015-05-25 18:08

Tai galite padaryti naudodami šį kodą:

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

Naudokite šį kodą, jei reikia iš naujo nustatyti indekso vertę kilpos pabaigoje:

 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 atsakymą pateikė Liam gegužės 25 d. 15:26 2015-05-25 18:26

Atitinka šią diskusiją: http://bytes.com/topic/python/answers/464012-objects-list-index

Kontūro kontrastas

Dabartinė ciklizavimo pagal indeksus idėja naudoja integruotą „diapazono“ funkciją:

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

Abiejų elementų ir indeksų dviračiu galima pasiekti arba senąja idioma, arba naudojant naują integruotą zip funkciją [2]:

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

arba

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

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

9
05 мая '12 в 10:10 2012-05-05 10:10 atsakymas pateikiamas Thinker007 05 gegužės 12 d. 10:10 2012-05-05 10:10

Geriausias šios problemos sprendimas yra įmontuotas „python“ funkcijų skaičiavimas .
skaičiavimas grąžina eilutę
pirmoji indekso vertė
antroji masyvo elemento vertė su šiuo indeksu

 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 авг. atsakymą pateikė Anurag Misra 24 rug. 2017-08-24 09:15 '17 at 9:15 am 2017-08-24 09:15

Jei sąrašas neturi dublikato vertės:

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

Priešingu atveju naudokite enumerate .

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

ARBA naudokite toliau:

 for counter in range(len(ints)): print(counter, ints[counter]) 
5
10 июня '18 в 6:59 2018-06-10 06:59 Atsakymą RIshu pateikia birželio 18 d. 18 val. 6:59 val. 2018-06-10 06:59

Savo klausime rašote „Kaip gauti prieigą prie kilpos indekso, šiuo atveju nuo 1 iki 5“?

Tačiau sąrašo indeksas prasideda nuo nulio. Taigi, mes turime žinoti, ar tai, ko iš tikrųjų norite, yra indeksas ir kiekvieno sąrašo elemento elementas, ar tikrai norite, kad numeriai prasidėtų nuo 1. Laimei, pythone yra lengva padaryti vieną ar abu.

Pirma, siekiant išsiaiškinti, skaičiavimo funkcija, iteratyviai grąžina indeksą ir atitinkamą elementą kiekvienam sąrašo elementui.

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

Išvada dėl pirmiau minėto

 0 1 1 2 2 3 3 4 4 5 

Atkreipkite dėmesį, kad indeksas veikia nuo 0. Šis tipo indeksavimas yra paplitęs tarp šiuolaikinių programavimo kalbų, įskaitant python ir c.

Jei norite, kad jūsų kilpa sudarytų dalį sąrašo, galite naudoti standartinę python sintaksę tam tikrai sąrašo daliai. Pvz., Galite naudoti antrojo sąrašo skilties, bet ne paskutinio elemento, naudojimą

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

Atkreipkite dėmesį, kad dar kartą išvesties indeksas veikia nuo 0

 0 2 1 3 2 4 

Tai sukelia start = n jungiklį skaičiavimui (). Jis tiesiog perkelia indeksą, lygiai taip pat galite tiesiog pridėti numerį prie indekso viduje.

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

kurių produkcija

 1 1 2 2 3 3 4 4 5 5 
3
15 авг. atsakymą pateikė DrM 15 rug . 2018-08-15 20:52 '18 - 20:52 2018-08-15 20:52

Taip pat galite pabandyti atlikti šiuos veiksmus:

 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) 

Išeiti

 0 ['itemA', 'ABC'] 1 ['itemB', 'defg'] 2 ['itemC', 'drug'] 3 ['itemD', 'ashok'] 
3
07 февр. Atsakymą pateikė Ashok Kumar Jayaraman 07 vasaris. 2018-02-07 17:04 '18, 5:04 val. 2018-02-07 17:04

Galite naudoti index metodą

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

Redagavimas Skirta pastaboms, kad šis metodas neveikia, jei yra ints dublikatai, žemiau pateiktas metodas turėtų veikti bet kokias vertes ints :

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

Arba

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

jei norite gauti indeksą ir vertę ints kaip ints sąrašą.

Jis naudoja pasirinktą atsakymą į šį klausimą, tačiau naudojasi sąrašo supratimu, todėl jį greičiau sudaro mažiau kodų.

1
31 мая '18 в 0:34 2018-05-31 00:34 atsakymas pateikiamas killerT2333 gegužės 31 d., 18 val. 0:34 2018-05-31 00:34

Jei kartoju nums = [1,2,3,4,5], norėčiau daryti

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

Arba gaukite ilgį kaip 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 atsakymą pateikė Ankur Kothari birželio 4 d. 18 val. 5:10 2018-06-04 05:10

Tai taip pat galima atlikti taikant index() metodą.

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

Čia indeksavimas prasideda nuo 0. Bet jei jums reikia jį pradėti nuo 1, tiesiog pridėkite 1 prie index() metodo taip

 for i in int: print(int.index(i) + 1, i) 
1
30 нояб. Atsakymą pateikė Loochie lapkričio 30 d 2018-11-30 12:25 '18 12:25 pm 2018-11-30 12:25

Štai ką jūs gaunate, kai pasiekiate ciklų indeksus:

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

2019

17 янв. atsakymą pateikė ARGeo 17 sausis 2019-01-17 04:07 '19, 16:07 pm 2019-01-17 04:07

Jei norite spausdinti eilutę (indeksą, vertę) sąrašo prasme, naudodami kilpą:

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

Išvada:

 [(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)] 
0
24 апр. atsakymą pateikė lola balandžio 24 d 2018-04-24 13:53 '18, 13:53 pm 2018-04-24 13:53

Tai gerai tinka:

 list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3] for x in list1: print('index:', list1.index(x), 'value:', x) 
-1
24 апр. atsakymą pateikė 24 val. 2018-04-24 13:45 '18 - 1:45 pm 2018-04-24 13:45

Gavote atsakymų seriją, paaiškinančią enumerate , bet jei jums reikia tik indekso, kad galėtumėte pasiekti atitinkamus įrašus dviejuose sąrašuose, Python 3: zip yra kitas būdas, kuris yra švaresnis ir paprastesnis.

Pvz., Jei naudojate rodyklę, kad ištrauktumėte atitinkamus savo sąrašo numerius, galite tai padaryti taip:

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

Tai lems

 8 - John 23 - Sue 45 - Johannes 12 - Patel 78 - Ian 
-1
14 февр. atsakymą pateikė Gary R. 14 vasaris. 2018-02-14 22:20 '18, 10:20 val. 2018-02-14 22:20

Kiti klausimai apie žymų „ arba Užduoti klausimą