Pertanyaan Mengakses indeks dalam 'untuk' loop?


Bagaimana cara mengakses indeks itu sendiri untuk daftar seperti berikut ini?

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

Ketika saya mengulangnya menggunakan for loop, bagaimana cara mengakses indeks loop, dari 1 hingga 5 dalam kasus ini?


2560
2018-02-06 22:47


asal


Jawaban:


Menggunakan variabel status tambahan, seperti variabel indeks (yang biasanya Anda gunakan dalam bahasa seperti C atau PHP), dianggap non-pythonic.

Pilihan yang lebih baik adalah menggunakan fungsi built-in enumerate(), tersedia di kedua Python 2 dan 3:

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

Periksa PEP 279 untuk lebih.


4444
2018-02-06 22:52



Menggunakan loop for, bagaimana cara mengakses indeks loop, dari 1 hingga 5 dalam kasus ini?

Menggunakan enumerate untuk mendapatkan indeks dengan elemen saat Anda melakukan iterasi:

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

Dan perhatikan bahwa indeks Python mulai dari nol, jadi Anda akan mendapatkan 0 hingga 4 dengan yang di atas. Jika Anda ingin menghitung, 1 hingga 5, lakukan ini:

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

Aliran kontrol tidak konsisten

Apa yang Anda minta adalah setara dengan Pythonic berikut ini, yang merupakan algoritma yang sebagian besar programmer dari bahasa tingkat yang lebih rendah akan menggunakan:

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

Atau dalam bahasa yang tidak memiliki pengulangan untuk setiap lingkaran:

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

atau kadang-kadang lebih umum (tetapi tidak secara otomatis) ditemukan dalam Python:

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

Gunakan Fungsi Enumerasi

Python enumerate fungsi mengurangi kekacauan visual dengan menyembunyikan akuntansi untuk indeks, dan mengenkapsulasi iterable ke iterable lain (sebuah enumerate objek) yang menghasilkan tupel dua-item indeks dan item yang dapat diberikan oleh iterable asli. Itu terlihat seperti ini:

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

Contoh kode ini cukup baik resmi contoh perbedaan antara kode yang idiomatik dari Python dan kode yang tidak. Kode idiomatik canggih (tetapi tidak rumit) Python, ditulis dengan cara yang dimaksudkan untuk digunakan. Kode Idiomatic diharapkan oleh para desainer bahasa, yang berarti bahwa biasanya kode ini tidak hanya lebih mudah dibaca, tetapi juga lebih efisien.

Menghitung jumlah

Bahkan jika Anda tidak perlu indeks saat Anda pergi, tetapi Anda perlu menghitung iterasi (kadang-kadang diinginkan), Anda dapat memulai dengan 1 dan nomor terakhir akan dihitung.

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

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

Jumlahnya tampaknya lebih banyak yang ingin Anda minta (sebagai lawan indeks) ketika Anda mengatakan Anda menginginkan dari 1 hingga 5.


Memecahkannya - penjelasan selangkah demi selangkah

Untuk memecah contoh ini, katakan kami memiliki daftar item yang ingin kami ulangi dengan indeks:

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

Sekarang kita melewati ini berulang untuk menghitung, membuat objek enumerasi:

enumerate_object = enumerate(items) # the enumerate object

Kita dapat menarik item pertama dari hal ini, bahwa kita akan mendapatkan satu lingkaran dengan next fungsi:

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

Dan kita lihat kita mendapatkan tupel 0, indeks pertama, dan 'a', item pertama:

(0, 'a')

kita bisa menggunakan apa yang disebut sebagai "urutan membongkar"untuk mengekstrak unsur-unsur dari dua tupel ini:

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

dan ketika kami memeriksa index, kami menemukan itu mengacu pada indeks pertama, 0, dan item mengacu pada item pertama, 'a'.

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

Kesimpulan

  • Indeks Python mulai dari nol
  • Untuk mendapatkan indeks ini dari iterable saat Anda mengulanginya, gunakan fungsi enumerasi
  • Menggunakan enumerasi dengan cara idiomatis (bersama dengan tuple unpacking) membuat kode yang lebih mudah dibaca dan dipelihara:

Jadi lakukan ini:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)

516
2018-01-21 17:11



Ini cukup sederhana untuk memulainya 1 Selain daripada 0:

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

Catatan

Petunjuk penting, meski sedikit menyesatkan sejak itu index akan menjadi tuple  (idx, item) sini. Baik untuk pergi.


105
2018-05-27 10:04



for i in range(len(ints)):
   print i, ints[i]

67
2018-02-06 22:49



Seperti norma dalam Python ada beberapa cara untuk melakukan ini. Dalam semua contoh, anggap: lst = [1, 2, 3, 4, 5]

1. Menggunakan enumerasi (dianggap paling idiomatis)

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

Ini juga merupakan pilihan paling aman menurut saya karena kemungkinan masuk ke rekursi tak terbatas telah dieliminasi. Baik item dan indeksnya disimpan dalam variabel dan tidak perlu menulis kode lebih lanjut untuk mengakses item.

2. Membuat variabel untuk menahan indeks (menggunakan for)

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

3. Membuat variabel untuk menahan indeks (menggunakan while)

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

4. Selalu ada cara lain

Seperti yang dijelaskan sebelumnya, ada cara lain untuk melakukan ini yang belum dijelaskan di sini dan mereka bahkan dapat menerapkan lebih banyak dalam situasi lain. misalnya menggunakan itertools.chain dengan untuk. Ini menangani loop bersarang lebih baik daripada contoh lainnya.


34
2017-08-15 02:17



Cara kuno:

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

Daftar pemahaman:

[ (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)
>>> 

20
2018-02-06 22:52



Cara tercepat untuk mengakses indeks daftar dalam lingkaran Python 2.7 adalah menggunakan metode jangkauan untuk daftar kecil dan metode enumerasi untuk daftar ukuran sedang dan besar.

Silahkan lihat pendekatan berbeda yang dapat digunakan untuk mengulang lebih dari daftar dan mengakses nilai indeks dan metrik kinerja mereka (yang saya kira akan berguna untuk Anda) dalam contoh kode di bawah ini:

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

Lihat metrik kinerja untuk setiap metode di bawah ini:

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

Sebagai hasilnya, menggunakan range metode adalah yang tercepat hingga daftar dengan 1000 item. Untuk daftar dengan ukuran> 10.000 item enumerate adalah pemenangnya.

Menambahkan beberapa tautan bermanfaat di bawah ini:


16
2017-08-04 09:49



Saya tidak tahu apakah yang berikut ini pythonic atau tidak, tetapi menggunakan fungsi Python enumerate dan mencetak indeks dan nilainya.

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

Keluaran:

0 8
1 23
2 45
3 12
4 78

16
2017-10-28 18: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)

Dengan cara ini Anda dapat memperpanjang daftar. Perpanjang artinya Anda dapat menambahkan beberapa nilai sekaligus.

Untuk menambahkan daftar ini, Anda harus menulis kode yang diberikan di bawah ini:

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

Dengan cara ini Anda dapat menambahkan satu nilai pada satu waktu. Jika Anda menulis ints.append([1]) jadi ini akan membuat daftar sub untuk elemen ini.


15
2018-02-05 17:28



Pertama-tama, indeks akan mulai dari 0 hingga 4. Bahasa pemrograman mulai dihitung dari 0; jangan lupakan itu atau Anda akan menemukan indeks diluar batasan pengecualian. Yang Anda butuhkan dalam for loop adalah penghitungan variabel dari 0 hingga 4 seperti:

for x in range(0, 5):

Perlu diingat bahwa saya menulis 0 hingga 5 karena loop berhenti satu angka sebelum batas maksimum. :)

Untuk mendapatkan nilai dari penggunaan indeks

list[index]

11
2018-05-25 15:08