Apa yang for row_number, row in enumerate(cursor):
dilakukan dengan Python?
Apa enumerate
artinya dalam konteks ini?
Apa yang for row_number, row in enumerate(cursor):
dilakukan dengan Python?
Apa enumerate
artinya dalam konteks ini?
Jawaban:
The enumerate()
Fungsi menambahkan counter ke iterable.
Jadi untuk setiap elemen dalam cursor
, tupel diproduksi dengan (counter, element)
; yang for
lingkaran mengikat bahwa untuk row_number
dan row
masing-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 0
tetapi 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 it
return 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
.
item
maka Anda dapat menghapus tanda kurung: D
yield
/ yield from
, atau ekspresi generator, yang secara implisit yield
); 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 mencakup enumerate
.
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 enumerate
membuat 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 enumerate
fungsinya.
i = 0
for n in list_of_letters:
print (i, n)
i += 1
Ini menghasilkan output yang sama.
Tetapi dengan enumerate
saya 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, 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"]
, 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 range
tetapi kemudian mengakses item yang Anda perlukan untuk mengindeksnya (yaitu, joint_values[i]
).
Meskipun pengguna lain menyebutkan implementasi enumerate
penggunaan zip
, saya pikir cara yang lebih murni (tapi sedikit lebih rumit) tanpa menggunakan itertools
adalah sebagai berikut:
def enumerate(l, start=0):
return zip(range(start, len(l) + start), l)
Contoh:
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 enumerate
fungsi aslinya .
itertools
bahwa range
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 melakukannya range(len(myfile))
karena panjangnya tidak diketahui sampai Anda mencapai EOF.
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')