'For' loops üçün giriş index?

Aşağıdakı kimi bir siyahı üçün indeksin özünə necə daxil ola bilərəm?

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

Bir döngə ilə keçəndə, bu halda 1 ilə 5 arasında loop indeksinə necə daxil ola bilərəm?

2850
07 февр. 07 fevralda Joan Venge tərəfindən təyin olundu 2009-02-07 01:47 '09 at 1:47 'da 2009-02-07 01:47
@ 23 cavab

Əlavə bir dövlət dəyişənini (məsələn, C və ya PHP kimi dillərdə istifadə etdiyiniz) bir index dəyişən kimi istifadə etmək qeyri-pythonik hesab olunur.

Ən yaxşı seçim hər ikisi Python 2 və 3-də olan daxili funksiyası enumerate() funksiyasından istifadə etməkdir:

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

PEP 279 haqqında daha ətraflı oxuyun.

4911
07 февр. Mike Hordecki tərəfindən verilmiş cavab 07 fevral. 2009-02-07 01:52 '09 saat 01:52 'da 2009-02-07 01:52

Bir loop istifadə edərək, bu halda 1 ilə 5 arasında loop indeksinə necə daxil ola bilərəm?

enumerate edildikdə bir maddə ilə bir index almaq üçün enumerate istifadə edin:

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

Qeyd edək ki, Python indeksləri sıfırdan başlayır, beləliklə yuxarıdan 0 ilə 4 arasında dəyişəcəyik. Bunu etmək üçün 1-dən 5-ə qədər bir saytı isterseniz:

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

Unidiomatic nəzarət axını

Sizə soruşan şey aşağıdakı pitonik ekvivalentdir: aşağı səviyyəli dillərin ən proqramçılarından istifadə edəcək alqoritmdir:

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

Və ya loop üçün yoxdur üçün dillərdə:

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

və ya bəzən daha tez-tez (lakin unikal ölçüdə) olan Python:

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

Numaralandırma funksiyasından istifadə edin

Python-nun enumerate funksiyası, indeksin mühasibatını gizlətmək və iterabilitməni başqa bir iterable (obyektin sayını) daxil etməklə gizlədir, bu, iki mövqeli indeksli nişan verir və orijinal iterable tərəfindən veriləcək elementdir. Belə görünür:

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

Bu kod nümunəsi olduqca yaxşıdır ki, kod olmayan Python kodu ilə kodu arasında olan fərqin nümunəsi. Sözsüz kod, kompleks (lakin kompleks olmayan) Python, istifadə olunacaq şəkildə yazılmışdır. Idiomatic kodu dil inkişafçıları tərəfindən gözlənilir, yəni bu kod adətən daha çox oxunaqlı deyil, daha səmərəli olur.

Fakturanın alınması

Gedərkən indeksə ehtiyacınız olmasa da, təkrarlamaq lazımdır (bəzən istənilən), 1 başlaya bilərsiniz, son nömrəniz isə hesabınız olacaq.

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

Güman 1-dən 5-dək istədiyinizi söylədiyiniz zaman (indeksdən fərqli olaraq) soruşmaq niyyətindəyinizdən çoxdur.


Məhv - addım-addım izahat

Bu nümunələri pozmaq üçün, bir index istifadə etməklə təkrarlamaq istədiyimiz maddələrin siyahısı var:

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

İndi bu iteratsiyanı sayma sayına salırıq və hesablama obyektini yaradırıq:

 enumerate_object = enumerate(items) # the enumerate object 

Birinci funksiyanı next funksiyanı bir loopla əldə edəcəyimiz bu təkrarlanandan çıxara bilərik:

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

Və biz görürük ki, 'a' element olan 0 , ilk indeks və 'a' , ilk element:

 (0, 'a') 

bu iki tüptən elementləri çıxarmaq üçün " serialın açılması " adını istifadə edə bilərik:

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

index yoxladığımız zaman ilk indeksə istinad etdiyini görürük 0 və item 'a' elementinə aiddir.

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

Nəticə

  • Python indeksləri sıfırdan başlayır
  • Bu göstəriciləri təkrarlamadan əldə etmək üçün, onu təkrarladığınız zaman sayım funksiyasından istifadə edin
  • Hadisəli rejimi ilə birləşmələri istifadə edərək (bir paketin açılması ilə birlikdə) daha oxunaqlı və dəstəklənən kodu yaradır:

Beləliklə:

 for index, item in enumerate(items, start=0): # Python indexes start at zero print(index, item) 
593
21 янв. Cavab Aaron Hall Jan 21 tərəfindən verilir 2015-01-21 20:11 '15 'də 20:11' də, 2015-01-21 20:11

1 dən başqa 1 ilə başlamaq olduqca sadədir:

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

Qeyd

index bir tuple olacaq (idx, item) olduğundan, bir az yanıltıcı olsa da əhəmiyyətli bir işarədir. Gedin yaxşı.

111
27 мая '14 в 13:04 2014-05-27 13:04 Cavab Clayton tərəfindən verilir 27 May '13 13:04 2014-05-27 13:04
 for i in range(len(ints)): print i, ints[i] 
76
07 февр. David Hanak tərəfindən verilmiş cavab 07 Feb 2009-02-07 01:49 '09 at 1:49 pm 2009-02-07 01:49

Pythonda olduğu kimi, bunun bir neçə yolu var. Bütün nümunələrdə, ehtimal: lst = [1, 2, 3, 4, 5]

1. Bir numaralandırma (ən çox iddiasiyalı hesab olunur)

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

Bu, mənim fikrimcə, ən etibarlı seçimdir, çünki sonsuz recursiona keçid ehtimalı aradan qaldırılmışdır. Hər iki element və onun indeksi dəyişənlərdə saxlanılır və elementə daxil olmaq üçün heç bir əlavə kod yazmağa ehtiyac yoxdur.

2. İndeksin saxlanması üçün bir dəyişən yaradın ( for )

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

3. Dizini saxlamaq üçün dəyişən yaradın (istifadə while )

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

4. Başqa bir yol var.

Daha əvvəl izah edildiyi kimi, burada açıqlanmayan bir başqa yol var və onlar hətta digər hallarda daha çox müraciət edə bilərlər. məsələn, itertools.chain istifadə edərək. Daxili döngələri digər nümunələrdən daha yaxşı idarə edir.

39
15 авг. cavab verildi Charitoo 15 aug. 2017-08-15 05:17 '17 də 5:17 'də 2017-08-15 05:17' də

Köhnə moda yol:

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

Mühasibat siyahısı:

 [ (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 февр. Cavab Charlie Martin tərəfindən verilir 07 fevral. 2009-02-07 01:52 '09 saat 01:52 'da 2009-02-07 01:52

Python 2.7- də bir döngənin içərisində siyahı göstəricilərinə daxil olmaq üçün ən sürətli yolu, kiçik siyahılar üçün aralıq metoddan istifadə etmək və orta və böyük ölçü siyahıları üçün metodu göstərməkdir .

Aşağıdakı kod nümunələrində siyahıdan və giriş indeksindən və onların performans göstəricilərindən (sizin üçün faydalı olduğumu düşündüyünüz) yinelemek üçün istifadə edə biləcəyiniz müxtəlif yanaşmalara baxın:

 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 

Aşağıdakı hər bir üsul üçün Performans Göstəricilərinə baxın:

 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 

Nəticədə, range metodunun istifadəsi 1000 məhsulun siyahısını ən sürətli təşkil edir. > 10.000 ədəd ölçüsü olan bir siyahı enumerate qalibin enumerate .

Aşağıdakı bəzi faydalı bağlantılar əlavə edin:

18
04 авг. Cavab Andriy İvaneyko tərəfindən verilir 04 avqust . 2016-08-04 12:49 '16 at 12:49 2016-08-04 12:49

Aşağıdakı pythonic olub-olmadığını bilmirəm, amma Python funksiyasından istifadə edir və indeksləri və dəyəri enumerate .

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

Nəticə:

 0 8 1 23 2 45 3 12 4 78 
16
28 окт. istifadəçi tərəfindən verilmiş cavab 2912389 28 oktyabr 2013-10-28 21:17 '13 at 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) 

Yəni siyahısı genişləndirə bilərsiniz. Genişləmə, birdən çox dəyərləri bir dəfə əlavə edə bilərsiniz.

Bu siyahı əlavə etmək üçün aşağıdakı kodu yazmalısınız:

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

Beləliklə, bir zamanda bir dəyər əlavə edə bilərsiniz. ints.append([1]) , bu, bu maddə üçün əlavə siyahı yaradacaq.

15
05 февр. cavab verildi iamjayp 05 fevral. 2015-02-05 20:28 '15 saat 20:28 'də 2015-02-05 20:28

İlk növbədə indekslər 0'dan 4-ə qədər olacaq. Proqramlaşdırma dili 0-da başlayır; bu barədə unutma və istisna istisna olmaqla qarşılaşacaqsınız. Bir loop üçün lazım olan bütün dəyişən, 0-dan 4-ə kimi hesablanır:

 for x in range(0, 5): 

0'dan 5-ə qədər yazdığımı unutmayın, çünki dövr bir ədədi maksimuma qədər dayandırır :)

İndeks dəyərini almaq üçün istifadə edin

 list[index] 
11
25 мая '15 в 18:08 2015-05-25 18:08 Cavab ytpillai tərəfindən mayın 25-də saat 15 : 00-da verilir 2015-05-25 18:08

Bunu bu kodla edə bilərsiniz:

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

Döngünün sonunda index dəyərini yenidən qurmaq lazımdırsa bu kodu istifadə edin:

 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 cavab Liam tərəfindən 25 May 'da 18:26' də verilir 2015-05-25 18:26

Bu müzakirə ilə uyğun: http://bytes.com/topic/python/answers/464012-objects-list-index

Loop counter iteration

İndekslər tərəfindən siklizasiya üçün mövcud deyim daxili "sıra" funksiyasından istifadə edir:

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

Hər iki elementdə və göstəricilərdə velosiped əldə etmək, köhnə idiom və ya yeni quraşdırılmış zip funksiyasından istifadə edilə bilər [2]:

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

və ya

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

http://www.python.org/dev/peps/pep-0212/ vasitəsilə

9
05 мая '12 в 10:10 2012-05-05 10:10 cavab 05 May 2012 at 10:10 2012-05-05 10:10

Bu problemin ən yaxşı həlli , python quraşdırılmış funksiya sayımından istifadə etməkdir .
numaralandırma bir tuple qaytarır
ilk indeksi dəyər
bu göstərici ilə sıra elementinin ikinci dəyəri

 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 авг. Cavab Anurag Misra 24 aug tərəfindən verilir . 2017-08-24 09:15 '17 saat 09:15 'da 2017-08-24 09:15

Siyahıda duplicate dəyəri yoxdur:

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

Əks halda, enumerate istifadə edin.

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

Yoxsa aşağıda istifadə edin:

 for counter in range(len(ints)): print(counter, ints[counter]) 
5
10 июня '18 в 6:59 2018-06-10 06:59 Cavab RIshu tərəfindən 10 İyun '18' də saat 6:59 'da 2018-06-10 06:59' də verilir

Sizin sorğunuzda "bu vəziyyətdə 1 ilə 5 arasında loop indeksinə necə giriş əldə edə bilərəm?" Yazırsınız.

Lakin siyahı üçün indeks sıfırdan işləyir. Beləliklə, biz həqiqətən istədikləriniz siyahıda hər bir element üçün bir indeks və element olduğundan və ya nömrələri 1-dən başlamaq istədiklərini bilmək lazımdır. Xoşbəxtlikdən, python-da bir və ya hər ikisini etmək çox asandır.

Birincisi, aydınlaşdırmaq üçün, numaralandırma funksiyası iterativ olaraq siyahıda hər bir element üçün bir indeks və müvafiq elementi qaytarır.

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

Daha sonra yuxarıda göstərilən nəticə

 0 1 1 2 2 3 3 4 4 5 

Qeyd edək ki, indeks 0-dan işləyir. İndeksinqin bu növü python və c daxil olmaqla, müasir proqramlaşdırma dilləri arasında geniş yayılmışdır.

Döngünüzün siyahının bir hissəsini əhatə etməsini istəyirsinizsə, siyahıdan bir hissəsi üçün standart python sözdizimini istifadə edə bilərsiniz. Məsələn, siyahıdakı ikinci maddədən keçmək üçün, lakin sonuncu maddə daxil deyil, istifadə edə bilərsiniz

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

Qeyd edək ki, bir dəfə daha çıxış indeksi 0,

 0 2 1 3 2 4 

Bu, numaralandırma üçün start = n keçidinə gətirib çıxarır (). Bu yalnız indeksi dəyişir, ekvivalentində yalnız loop içindəki indeksi bir sıra əlavə edə bilərsiniz.

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

hansı çıxdı

 1 1 2 2 3 3 4 4 5 5 
3
15 авг. cavab DrM 15 aug tərəfindən verilir . 2018-08-15 20:52 '18 də 20:52 2018-08-15 20:52 'də

Aşağıdakıları da edə bilərsiniz:

 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) 

Çıxın

 0 ['itemA', 'ABC'] 1 ['itemB', 'defg'] 2 ['itemC', 'drug'] 3 ['itemD', 'ashok'] 
3
07 февр. Cavab Ashok Kumar Jayaraman tərəfindən verilmişdir 07 fevral. 2018-02-07 17:04 '18 saat 05:04 'da 2018-02-07 17:04

index metodundan istifadə edə bilərsiniz

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

EDIT Bu metodun işləmədiyi şərhlərə həsr olunmuşdur, əgər ints dublikatlar varsa, aşağıda göstərilən üsul ints hər hansı bir dəyər üçün işləməlidir:

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

Və ya alternativ

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

hər ikisi də indeks və qiymətləri tüplərin siyahısı kimi intsdə almaq istəyirsən.

Bu, bu sorğu üçün seçilmiş enumerate metodundan istifadə edir, ancaq siyahı anlayışı ilə, daha az kodla daha sürətli edir.

1
31 мая '18 в 0:34 2018-05-31 00:34 cavab 31 may 2014 tarixində 0:34 2018-05-31 00:34 tarixində killerT2333 verilir

Əgər nums = [1,2,3,4,5] təkrar edərəm, mən bunu edərdim

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

Və ya uzunluğu 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 Cavab Ankur Kothari tərəfindən 04 İyun 18 'də saat 5:10' də 2018-06-04 05:10 'də verilir

Bu da index() metodundan istifadə edilə bilər.

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

Burada endeksleme 0'dan başlayır. Lakin 1-dən başlamaq lazımdırsa, index() metoduna aşağıdakı kimi əlavə edin

 for i in int: print(int.index(i) + 1, i) 
1
30 нояб. Cavab Loochie Nov 30 tərəfindən verilir 2018-11-30 12:25 '18 saat 12:25 'də 2018-11-30 12:25

Döngülər for göstəricilərə daxil olduqda əldə etdiyiniz nədir:

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

2019

17 янв. ARGeo tərəfindən verilmiş cavab 17 yanvar 2019-01-17 04:07 '19 saat 16:07 'da 2019-01-17 04:07

Bir loop for istifadə olunan siyahı mənasında bir nişanı (indeks, dəyər) çap etmək for :

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

Nəticə:

 [(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)] 
0
24 апр. Cavab lola tərəfindən 24 apreldə verilir 2018-04-24 13:53 '18 saat 13:53 'da 2018-04-24 13:53

Bu məqsədi çox yaxşı bir şəkildə yerinə yetirir:

 list1 = [10, 'sumit', 43.21, 'kumar', '43', 'test', 3] for x in list1: print('index:', list1.index(x), 'value:', x) 
-1
24 апр. Cavab Sumit Kumar 24 apr tərəfindən verilir . 2018-04-24 13:45 '18 saat 13:45 'də 2018-04-24 13:45

Nömrəni izah edən bir sıra cavablar aldınız, ancaq, yalnız iki siyahıda uyğun girişlərə daxil olmaq üçün bir indeksə ehtiyacınız varsa, Python 3: zip də daha təmiz və daha asan bir yol var.

Məsələn, siyahıdakı nömrələr üçün müvafiq adları çəkmək üçün bir indeks istifadə etsəniz, bunu belə edə bilərsiniz:

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

Bu səbəb olacaq

 8 - John 23 - Sue 45 - Johannes 12 - Patel 78 - Ian 
-1
14 февр. Cavab Gary R. tərəfindən verilir. 2018-02-14 22:20 '18 saat 10.20 'də 2018-02-14 22:20

Tags haqqında suallar və ya bir sual