Bagaimana Anda membalikkan iterasi dengan python?

Untuk objek yang dapat diindeks, pendekatan saat ini untuk iterasi terbalik rawan kesalahan, tidak alami, dan tidak dapat dibaca secara khusus

for i in xrange(n-1, -1, -1): print seqn[i]

Satu pendekatan lain saat ini melibatkan membalik daftar sebelum mengulanginya. Teknik itu menghabiskan siklus komputer, memori, dan baris kode

rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value _

Extended Slicing adalah pendekatan ketiga yang meminimalkan overhead kode tetapi tidak melakukan apa pun untuk efisiensi, keindahan, atau kejelasan memori

Iterasi mundur jauh lebih jarang daripada iterasi maju, tetapi dalam praktiknya hal itu muncul secara teratur. Lihat di bawah

Tambahkan fungsi bawaan yang disebut reversed() yang membuat iterator terbalik di atas objek urutan yang mendukung __getitem__() dan __len__()

Contoh di atas kemudian disederhanakan menjadi

for i in reversed(xrange(n)): print seqn[i]

for elem in reversed(seqn): print elem

Ide intinya adalah bahwa cara yang paling jelas, paling tidak rawan kesalahan untuk menentukan iterasi terbalik adalah dengan menentukannya dalam arah maju dan kemudian mengatakan terbalik

Implementasinya bisa sesederhana

def reversed(x): if hasattr(x, 'keys'): raise ValueError("mappings do not support reverse iteration") i = len(x) while i > 0: i -= 1 yield x[i] _

Tidak diperlukan perubahan sintaks bahasa. Proposal sepenuhnya kompatibel ke belakang

Implementasi AC dan pengujian unit ada di. https. //bug. python. org/masalah834422

PEP ini telah diterima secara bersyarat untuk Py2. 4. Kondisi tersebut berarti bahwa jika fungsi tersebut ternyata tidak berguna, maka dapat dihapus sebelum Py2. 4b1

  • reviter – Saran Jeremy Fincher cocok dengan penggunaan iter()
  • ireverse – menggunakan konvensi penamaan itertools
  • terbalik - sepertinya tidak ada yang menyukai ini kecuali saya

Nama terbalik bukan kandidat karena menduplikasi nama daftar. reverse() yang memutasi daftar yang mendasarinya

Kasus terhadap adopsi PEP adalah keinginan untuk menjaga agar jumlah fungsi bawaan tetap kecil. Ini perlu ditimbang dengan kesederhanaan dan kenyamanan memilikinya sebagai bawaan alih-alih disimpan di beberapa ruang nama lain

Berikut adalah beberapa contoh iterasi terbalik yang diambil dari perpustakaan standar dan komentar tentang mengapa iterasi terbalik diperlukan

  • atexit. exit_handlers() menggunakan

    while _exithandlers: func, targs, kargs = _exithandlers.pop() . . .

    Dalam aplikasi ini diperlukan popping, jadi fungsi baru tidak akan membantu

  • timbunanq. heapify() menggunakan for i in xrange(n//2 - 1, -1, -1) karena urutan tingkat yang lebih tinggi lebih mudah dibentuk dari pasangan urutan tingkat yang lebih rendah. Versi maju dari algoritme ini dimungkinkan; . Kode pengganti for i in reversed(xrange(n//2)) memperjelas rentang yang dicakup dan berapa banyak iterasi yang diperlukan
  • mhlib. tes() menggunakan

    testfolders.reverse(); for t in testfolders: do('mh.deletefolder(%s)' % `t`) _

    Kebutuhan akan iterasi terbalik muncul karena ekor dari list yang mendasari diubah selama iterasi

  • peron. _dist_try_harder() menggunakan rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value 0 karena loop menghapus elemen yang dipilih dari verfiles tetapi perlu membiarkan sisa daftar tetap utuh untuk iterasi lebih lanjut
  • acak. shuffle() menggunakan rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value 1 karena algoritme paling mudah dipahami sebagai elemen yang dipilih secara acak dari kumpulan yang semakin berkurang. Faktanya, algoritme dapat dijalankan dengan arah maju tetapi kurang intuitif dan jarang disajikan seperti itu dalam literatur. Kode pengganti rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value _2 jauh lebih mudah diverifikasi secara visual
  • rfc822. Pesan. __delitem__() menggunakan

    list.reverse() for i in list: del self.headers[i]

    Kebutuhan akan iterasi terbalik muncul karena ekor dari list yang mendasari diubah selama iterasi

Beberapa varian diajukan yang mencoba menerapkan reversed() ke semua iterables dengan menjalankan iterable hingga selesai, menyimpan hasilnya, dan kemudian mengembalikan iterator terbalik pada hasilnya. Sambil memenuhi beberapa pengertian umum penuh, menjalankan input sampai akhir bertentangan dengan tujuan penggunaan iterator sejak awal. Juga, bencana kecil terjadi jika iterator yang mendasarinya tidak terbatas

Menempatkan fungsi di modul lain atau melampirkannya ke objek tipe tidak dipertimbangkan. Seperti sepupunya, zip() dan enumerate(), fungsi ini harus dapat diakses langsung dalam pemrograman sehari-hari. Masing-masing memecahkan masalah perulangan dasar. iterasi kunci-langkah, penghitungan loop, dan iterasi terbalik. Membutuhkan beberapa bentuk akses bertitik akan mengganggu kesederhanaan, utilitas harian, dan aksesibilitasnya. Mereka adalah konstruksi perulangan inti, terlepas dari satu domain aplikasi apa pun

Apa itu iterasi terbalik?

std. reverse_iterator adalah adaptor iterator yang membalikkan arah iterator yang diberikan , yang setidaknya harus berupa model LegacyBidirectionalIteratoror bidirectional_iterator (sejak C++20).

Bagaimana Anda membalikkan daftar dalam iterasi?

Gunakan fungsi reversed() untuk mengulangi daftar dalam urutan terbalik , e. g. untuk item dalam urutan terbalik(my_list). . Fungsi reversed() mengambil iterator, seperti daftar, membalikkannya dan mengembalikan hasilnya.

Postingan terbaru

LIHAT SEMUA