Bagaimana cara mengakses indeks dalam satu for
lingkaran seperti berikut ini?
ints = [8, 23, 45, 12, 78]
for i in ints:
print('item #{} = {}'.format(???, i))
Saya ingin mendapatkan hasil ini:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
Ketika saya mengulanginya menggunakan for
loop, bagaimana cara mengakses indeks loop, dari 1 hingga 5 dalam hal ini?
Jawaban:
Menggunakan variabel status tambahan, seperti variabel indeks (yang biasanya Anda gunakan dalam bahasa seperti C atau PHP), dianggap non-pythonic.
Opsi yang lebih baik adalah menggunakan fungsi bawaan
enumerate()
, tersedia dalam Python 2 dan 3:Lihatlah PEP 279 untuk informasi lebih lanjut.
sumber
enumerate
menimbulkan overhead lain?enumerate
.Gunakan
enumerate
untuk mendapatkan indeks dengan elemen saat Anda mengulanginya:Dan perhatikan bahwa indeks Python dimulai dari nol, sehingga Anda akan mendapatkan 0 hingga 4 dengan yang di atas. Jika Anda ingin menghitung, 1 hingga 5, lakukan ini:
Aliran kontrol tidak otomatis
Apa yang Anda minta adalah persamaan Pythonic dari yang berikut, yang merupakan algoritma yang akan digunakan oleh kebanyakan programmer dari bahasa tingkat rendah:
Atau dalam bahasa yang tidak memiliki untuk-setiap loop:
atau kadang-kadang lebih umum (tetapi tidak langsung) ditemukan dalam Python:
Gunakan Fungsi Hitung
enumerate
Fungsi Python mengurangi kekacauan visual dengan menyembunyikan akuntansi untuk indeks, dan merangkum iterable ke iterable lain (enumerate
objek) yang menghasilkan dua item tuple indeks dan item yang akan disediakan iterable asli. Itu terlihat seperti ini:Contoh kode ini cukup baik contoh kanonik perbedaan antara kode yang idiomatik dari Python dan kode yang tidak. Kode idiomatik adalah Python yang canggih (tapi tidak rumit), ditulis dengan cara yang seharusnya digunakan. Kode idiomatik diharapkan oleh para perancang bahasa, yang berarti bahwa biasanya kode ini tidak hanya lebih mudah dibaca, tetapi juga lebih efisien.
Mendapatkan hitungan
Sekalipun Anda tidak membutuhkan indeks saat berjalan, tetapi Anda membutuhkan hitungan iterasi (kadang-kadang diinginkan) Anda bisa mulai dengan
1
dan angka terakhir akan menjadi hitungan Anda.Hitungan tampaknya lebih dari apa yang ingin Anda minta (bukan indeks) ketika Anda mengatakan ingin dari 1 hingga 5.
Memecahnya - penjelasan langkah demi langkah
Untuk memecah contoh-contoh ini, katakan kita memiliki daftar item yang ingin kita ulangi dengan indeks:
Sekarang kita meneruskan iterable untuk enumerate, membuat objek enumerate:
Kita dapat menarik item pertama dari iterable yang akan kita dapatkan dalam satu loop dengan
next
fungsi:Dan kami melihat kami mendapatkan tuple dari
0
, indeks pertama, dan'a'
, item pertama:kita bisa menggunakan apa yang disebut sebagai " sequence unpacking " untuk mengekstrak elemen dari dua tuple ini:
dan ketika kami memeriksa
index
, kami menemukan itu mengacu pada indeks pertama, 0, danitem
mengacu pada item pertama'a'
,.Kesimpulan
Jadi lakukan ini:
sumber
items
kosong?[1406, 1409]
. Jika saya mencetak ke konsol menggunakanprint(legData)
, hasilnya adalah [1406.1409] . Namun, jika saya mencoba mem-parsing nilai-nilai individual dari daftar sepertifor idx, xLeg in enumerate(legData):
print(idx, xLeg)
, itu memberi saya output bilangan bulat individual seperti [, 1, 4, 0, 6, dan seterusnya terhadap indeks 0, 1, 2, 3, 4 dll. (ya, tanda kurung & koma juga menjadi output seolah-olah mereka adalah bagian dari data itu sendiri ). Apa yang salah di sini?Cukup mudah untuk memulainya dari
1
selain0
:Catatan
Petunjuk penting, meskipun sedikit menyesatkan karena
index
akan ada dituple
(idx, item)
sini. Baik untuk pergi.sumber
index, item
hanyaindex
sangat menyesatkan, seperti yang Anda catat. Gunakan sajafor index, item in enumerate(ints)
.sumber
xrange
untuk pra-3.0.enumerate
menyimpan logika apa pun; Anda masih harus memilih objek mana yang akan diindeksi
, bukan?Seperti norma dalam Python ada beberapa cara untuk melakukan ini. Dalam semua contoh, asumsikan:
lst = [1, 2, 3, 4, 5]
1. Menggunakan enumerate ( dianggap paling idiom )
Ini juga merupakan pilihan paling aman menurut saya karena kesempatan untuk mengalami rekursi tak terbatas telah dihilangkan. Baik item dan indeksnya disimpan dalam variabel dan tidak perlu menulis kode lebih lanjut untuk mengakses item.
2. Membuat variabel untuk menyimpan indeks ( menggunakan
for
)3. Membuat variabel untuk menahan indeks ( menggunakan
while
)4. Selalu ada cara lain
Seperti dijelaskan sebelumnya, ada cara lain untuk melakukan ini yang belum dijelaskan di sini dan mereka bahkan dapat menerapkan lebih dalam situasi lain. misalnya menggunakan
itertools.chain
dengan untuk. Ini menangani loop bersarang lebih baik daripada contoh lainnya.sumber
Cara kuno:
Pemahaman daftar:
sumber
Cara tercepat untuk mengakses indeks daftar dalam loop di Python 2.7 adalah dengan menggunakan metode rentang untuk daftar kecil dan menghitung metode untuk daftar ukuran sedang dan besar.
Silakan lihat berbagai pendekatan yang dapat digunakan untuk beralih dari daftar dan mengakses nilai indeks dan metrik kinerjanya (yang saya kira akan berguna bagi Anda) dalam contoh kode di bawah ini:
Lihat metrik kinerja untuk setiap metode di bawah ini:
Akibatnya, menggunakan
range
metode adalah yang tercepat hingga daftar dengan 1000 item. Untuk daftar dengan ukuran> 10.000 itemenumerate
adalah pemenangnya.Menambahkan beberapa tautan bermanfaat di bawah ini:
Apa perbedaan antara fungsi rentang dan xrange di Python 2.X?
Apa yang lebih cepat untuk loop menggunakan enumerate atau untuk loop menggunakan xrange dengan Python?
range (len (list)) atau enumerate (list)?
sumber
Pertama-tama, indeks akan dari 0 hingga 4. Bahasa pemrograman mulai menghitung dari 0; jangan lupa itu atau Anda akan menemukan indeks di luar batas. Yang Anda butuhkan dalam for loop adalah penghitungan variabel dari 0 hingga 4 seperti:
Perlu diingat bahwa saya menulis 0 hingga 5 karena loop berhenti satu angka sebelum maks. :)
Untuk mendapatkan nilai penggunaan indeks
sumber
Inilah yang Anda dapatkan ketika Anda mengakses indeks dalam
for
loop:Hasil:
Hasil:
Hasil:
sumber
Menurut diskusi ini: http://bytes.com/topic/python/answers/464012-objects-list-index
Loop iterasi konter
Ungkapan saat ini untuk pengulangan indeks menggunakan fungsi built-in
range
:Looping kedua elemen dan indeks dapat dicapai baik dengan idiom lama atau dengan menggunakan fungsi
zip
built-in yang baru:atau
via http://www.python.org/dev/peps/pep-0212/
sumber
Anda dapat melakukannya dengan kode ini:
Gunakan kode ini jika Anda perlu mengatur ulang nilai indeks di akhir loop:
sumber
Solusi terbaik untuk masalah ini adalah menggunakan enumerate in-build function python.
enumerate return tuple
nilai pertama adalah indeks
nilai kedua adalah elemen array pada indeks itu
sumber
Dalam pertanyaan Anda, Anda menulis "bagaimana cara mengakses indeks loop, dari 1 hingga 5 dalam kasus ini?"
Namun, indeks untuk daftar berjalan dari nol. Jadi, maka kita perlu tahu apakah yang Anda inginkan sebenarnya adalah indeks dan item untuk setiap item dalam daftar, atau apakah Anda benar-benar ingin angka dimulai dari 1. Untungnya, dengan Python, mudah untuk melakukan salah satu atau keduanya.
Pertama, untuk memperjelas,
enumerate
fungsi berulang indeks dan item terkait untuk setiap item dalam daftar.Output untuk di atas adalah,
Perhatikan bahwa indeks berjalan dari 0. Jenis pengindeksan ini umum di antara bahasa pemrograman modern termasuk Python dan C.
Jika Anda ingin loop Anda menjangkau bagian dari daftar, Anda bisa menggunakan sintaks Python standar untuk bagian dari daftar. Misalnya, untuk mengulang dari item kedua dalam daftar hingga tetapi tidak termasuk item terakhir, Anda bisa menggunakan
Perhatikan bahwa sekali lagi, indeks output berjalan dari 0,
Itu membawa kita ke
start=n
saklar untukenumerate()
. Ini hanya mengimbangi indeks, Anda bisa menambahkan angka ke indeks di dalam loop.yang hasilnya adalah
sumber
Jika saya mengulangi,
nums = [1, 2, 3, 4, 5]
saya akan melakukannyaAtau dapatkan panjangnya sebagai
l = len(nums)
sumber
Jika tidak ada nilai duplikat dalam daftar:
sumber
enumerate
. Anda harus menghapus jawaban ini.Anda juga dapat mencoba ini:
Outputnya adalah
sumber
Anda dapat menggunakan
index
metode iniEDIT Disorot dalam komentar bahwa metode ini tidak berfungsi jika ada duplikat
ints
, metode di bawah ini akan berfungsi untuk nilai apa pun diints
:Atau sebagai alternatif
jika Anda ingin mendapatkan kedua indeks dan nilai
ints
sebagai daftar tupel.Ini menggunakan metode
enumerate
dalam jawaban yang dipilih untuk pertanyaan ini, tetapi dengan pemahaman daftar, membuatnya lebih cepat dengan kode lebih sedikit.sumber
Jawaban sederhana menggunakan While Loop:
Keluaran:
sumber
Untuk mencetak tupel (indeks, nilai) dalam pemahaman daftar menggunakan
for
loop:Keluaran:
sumber
Ini melayani tujuan dengan cukup baik:
sumber
index()
akan mencari kejadian pertamax
, tidak menyebutkan waktu O ( n ^ 2 ) yang diperlukan untuk mencari setiap elemen.