Apa yang dimaksud dengan enumerate ()?

Jawaban:

513

The enumerate()Fungsi menambahkan counter ke iterable.

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 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).

Martijn Pieters
sumber
92

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.

RemcoGerlich
sumber
1
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 = 0
for 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)
Dora
sumber
20

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:

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 enumeratefungsi aslinya .

Rafael
sumber
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')
Ashok Kumar Jayaraman
sumber