Jadi untuk setiap elemen dalam cursor, tupel diproduksi dengan (counter, element); yang forlingkaran mengikat bahwa untuk row_numberdan rowmasing-masing.
Demo:
>>> elements =('foo','bar','baz')>>>for elem in elements:...print elem
...
foo
bar
baz
>>>for count, elem in enumerate(elements):...print count, elem
...0 foo
1 bar
2 baz
Secara default, enumerate()mulai menghitung pada 0tetapi jika Anda memberikan argumen bilangan bulat kedua, itu akan mulai dari angka itu sebagai gantinya:
>>>for count, elem in enumerate(elements,42):...print count, elem
...42 foo
43 bar
44 baz
Jika Anda menerapkan kembali dengan enumerate()Python, berikut adalah dua cara untuk mencapai itu; satu menggunakan itertools.count()untuk melakukan penghitungan, yang lainnya secara manual menghitung dalam fungsi generator :
from itertools import count
def enumerate(it, start=0):# return an iterator that adds a counter to each element of itreturn zip(count(start), it)
dan
def enumerate(it, start=0):
count = start
for elem in it:yield(count, elem)
count +=1
The pelaksanaannya di C lebih dekat dengan yang terakhir, dengan optimisations untuk menggunakan kembali objek tuple tunggal untuk umum for i, ...membongkar kasus dan menggunakan nilai C bilangan bulat standar untuk counter sampai meja menjadi terlalu besar untuk menghindari menggunakan Python objek bilangan bulat (yang tak terbatas).
Ini adalah fungsi bawaan yang mengembalikan objek yang dapat diulangi. Lihat dokumentasi .
Singkatnya, itu loop atas elemen iterable (seperti daftar), serta nomor indeks, digabungkan dalam sebuah tuple:
for item in enumerate(["a","b","c"]):print item
cetakan
(0,"a")(1,"b")(2,"c")
Akan sangat membantu jika Anda ingin mengulang urutan (atau hal yang dapat diubah lainnya), dan juga ingin memiliki penghitung indeks yang tersedia. Jika Anda ingin penghitung dimulai dari nilai lain (biasanya 1), Anda bisa memberikannya sebagai argumen kedua enumerate.
jika Anda menambahkan variabel kedua itemmaka Anda dapat menghapus tanda kurung: D
Abdelouahab
2
Pedantic: Ini adalah fungsi mengembalikan iterator, bukan generator. Generator adalah kelas spesifik fungsi yang ditentukan pengguna (menggunakan yield/ yield from, atau ekspresi generator, yang secara implisit yield); enumeratebukan generator. Untuk semua tujuan terkait pengetikan bebek tidak ada perbedaan, tetapi pengecekan tipe eksplisit dan dokumen bahasa Python hanya menggunakan istilah "generator" untuk satu tujuan, yang tidak mencakup enumerate.
ShadowRanger
22
Saya membaca buku ( Effective Python ) oleh Brett Slatkin dan dia menunjukkan cara lain untuk beralih ke daftar dan juga tahu indeks item saat ini dalam daftar tetapi dia menyarankan bahwa lebih baik tidak menggunakannya dan menggunakannya enumerate. Saya tahu Anda bertanya apa artinya enumerasi, tetapi ketika saya memahami yang berikut ini, saya juga mengerti bagaimana enumeratemembuat iterasi pada daftar sambil mengetahui indeks item saat ini lebih mudah (dan lebih mudah dibaca).
list_of_letters =['a','b','c']for i in range(len(list_of_letters)):
letter = list_of_letters[i]print(i, letter)
Outputnya adalah:
0 a
1 b
2 c
Saya juga terbiasa melakukan sesuatu, bahkan lebih konyol sebelum saya membaca tentang enumeratefungsinya.
i =0for n in list_of_letters:print(i, n)
i +=1
Ini menghasilkan output yang sama.
Tetapi dengan enumeratesaya hanya perlu menulis:
list_of_letters =['a','b','c']for i, letter in enumerate(list_of_letters):print(i, letter)
Seperti yang telah disebutkan oleh pengguna lain, enumerateadalah generator yang menambahkan indeks tambahan di sebelah setiap item yang dapat diulang.
Jadi jika Anda memiliki daftar mengatakan l = ["test_1", "test_2", "test_3"], yang list(enumerate(l))akan memberikan sesuatu seperti ini: [(0, 'test_1'), (1, 'test_2'), (2, 'test_3')].
Sekarang, kapan ini berguna? Case use yang mungkin adalah ketika Anda ingin beralih item, dan Anda ingin melewatkan item tertentu yang Anda hanya tahu indeksnya dalam daftar tetapi tidak nilainya (karena nilainya tidak diketahui pada saat itu).
for index, value in enumerate(joint_values):if index ==3:continue# Do something with the other `value`
Jadi kode Anda dibaca lebih baik karena Anda juga bisa melakukan perulangan reguler dengan rangetetapi kemudian mengakses item yang Anda perlukan untuk mengindeksnya (yaitu, joint_values[i]).
Meskipun pengguna lain menyebutkan implementasi enumeratepenggunaan zip, saya pikir cara yang lebih murni (tapi sedikit lebih rumit) tanpa menggunakan itertoolsadalah sebagai berikut:
l =["test_1","test_2","test_3"]
enumerate(l)
enumerate(l,10)
Keluaran:
[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]
[(10, 'test_1'), (11, 'test_2'), (12, 'test_3')]
Seperti disebutkan dalam komentar, pendekatan dengan jangkauan ini tidak akan bekerja dengan iterables yang sewenang-wenang seperti enumeratefungsi aslinya .
Alasan jawaban lainnya menyebutkan itertoolsbahwa rangependekatan Anda hanya bekerja dengan wadah. enumeratebekerja dengan iterables sewenang-wenang; jika Anda ingin mengulang file, for lineno, line in enumerate(myfile):berfungsi, tetapi Anda tidak bisa melakukannya range(len(myfile))karena panjangnya tidak diketahui sampai Anda mencapai EOF.
ShadowRanger
12
Fungsi enumerasi berfungsi sebagai berikut:
doc ="""I like movie. But I don't like the cast. The story is very nice"""
doc1 = doc.split('.')for i in enumerate(doc1):print(i)
Outputnya adalah
(0,'I like movie')(1," But I don't like the cast")(2,' The story is very nice')
Jawaban:
The
enumerate()
Fungsi menambahkan counter ke iterable.Jadi untuk setiap elemen dalam
cursor
, tupel diproduksi dengan(counter, element)
; yangfor
lingkaran mengikat bahwa untukrow_number
danrow
masing-masing.Demo:
Secara default,
enumerate()
mulai menghitung pada0
tetapi jika Anda memberikan argumen bilangan bulat kedua, itu akan mulai dari angka itu sebagai gantinya:Jika Anda menerapkan kembali dengan
enumerate()
Python, berikut adalah dua cara untuk mencapai itu; satu menggunakanitertools.count()
untuk melakukan penghitungan, yang lainnya secara manual menghitung dalam fungsi generator :dan
The pelaksanaannya di C lebih dekat dengan yang terakhir, dengan optimisations untuk menggunakan kembali objek tuple tunggal untuk umum
for i, ...
membongkar kasus dan menggunakan nilai C bilangan bulat standar untuk counter sampai meja menjadi terlalu besar untuk menghindari menggunakan Python objek bilangan bulat (yang tak terbatas).sumber
Ini adalah fungsi bawaan yang mengembalikan objek yang dapat diulangi. Lihat dokumentasi .
Singkatnya, itu loop atas elemen iterable (seperti daftar), serta nomor indeks, digabungkan dalam sebuah tuple:
cetakan
Akan sangat membantu jika Anda ingin mengulang urutan (atau hal yang dapat diubah lainnya), dan juga ingin memiliki penghitung indeks yang tersedia. Jika Anda ingin penghitung dimulai dari nilai lain (biasanya 1), Anda bisa memberikannya sebagai argumen kedua
enumerate
.sumber
item
maka Anda dapat menghapus tanda kurung: Dyield
/yield from
, atau ekspresi generator, yang secara implisityield
);enumerate
bukan generator. Untuk semua tujuan terkait pengetikan bebek tidak ada perbedaan, tetapi pengecekan tipe eksplisit dan dokumen bahasa Python hanya menggunakan istilah "generator" untuk satu tujuan, yang tidak mencakupenumerate
.Saya membaca buku ( Effective Python ) oleh Brett Slatkin dan dia menunjukkan cara lain untuk beralih ke daftar dan juga tahu indeks item saat ini dalam daftar tetapi dia menyarankan bahwa lebih baik tidak menggunakannya dan menggunakannya
enumerate
. Saya tahu Anda bertanya apa artinya enumerasi, tetapi ketika saya memahami yang berikut ini, saya juga mengerti bagaimanaenumerate
membuat iterasi pada daftar sambil mengetahui indeks item saat ini lebih mudah (dan lebih mudah dibaca).Outputnya adalah:
Saya juga terbiasa melakukan sesuatu, bahkan lebih konyol sebelum saya membaca tentang
enumerate
fungsinya.Ini menghasilkan output yang sama.
Tetapi dengan
enumerate
saya hanya perlu menulis:sumber
Seperti yang telah disebutkan oleh pengguna lain,
enumerate
adalah generator yang menambahkan indeks tambahan di sebelah setiap item yang dapat diulang.Jadi jika Anda memiliki daftar mengatakan
l = ["test_1", "test_2", "test_3"]
, yanglist(enumerate(l))
akan memberikan sesuatu seperti ini:[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]
.Sekarang, kapan ini berguna? Case use yang mungkin adalah ketika Anda ingin beralih item, dan Anda ingin melewatkan item tertentu yang Anda hanya tahu indeksnya dalam daftar tetapi tidak nilainya (karena nilainya tidak diketahui pada saat itu).
Jadi kode Anda dibaca lebih baik karena Anda juga bisa melakukan perulangan reguler dengan
range
tetapi kemudian mengakses item yang Anda perlukan untuk mengindeksnya (yaitu,joint_values[i]
).Meskipun pengguna lain menyebutkan implementasi
enumerate
penggunaanzip
, saya pikir cara yang lebih murni (tapi sedikit lebih rumit) tanpa menggunakanitertools
adalah sebagai berikut:Contoh:
Keluaran:
Seperti disebutkan dalam komentar, pendekatan dengan jangkauan ini tidak akan bekerja dengan iterables yang sewenang-wenang seperti
enumerate
fungsi aslinya .sumber
itertools
bahwarange
pendekatan Anda hanya bekerja dengan wadah.enumerate
bekerja dengan iterables sewenang-wenang; jika Anda ingin mengulang file,for lineno, line in enumerate(myfile):
berfungsi, tetapi Anda tidak bisa melakukannyarange(len(myfile))
karena panjangnya tidak diketahui sampai Anda mencapai EOF.Fungsi enumerasi berfungsi sebagai berikut:
Outputnya adalah
sumber