Apa cara terbaik untuk mendapatkan item terakhir dari iterator dengan Python 2.6? Misalnya, katakanlah
my_iter = iter(range(5))
Apa terpendek-kode / cara terbersih mendapatkan 4
dari my_iter
?
Saya bisa melakukan ini, tetapi sepertinya tidak terlalu efisien:
[x for x in my_iter][-1]
python
python-3.x
python-2.7
iterator
Peter
sumber
sumber
iter(range(5))
Jawaban:
sumber
None
? Inilah tepatnya untuk apaNone
. Apakah Anda menyarankan bahwa beberapa nilai default khusus fungsi bisa jadi benar? Jika iterator tidak benar-benar melakukan iterasi, maka nilai out-of-band lebih bermakna daripada beberapa default khusus fungsi yang menyesatkan.None
sebagai nilai default, itu pilihan Anda. Tidak ada tidak selalu merupakan default yang paling masuk akal, dan bahkan mungkin tidak keluar jalur. Secara pribadi saya cenderung menggunakan 'defaultvalue = object ()' untuk memastikan itu adalah nilai yang benar-benar unik. Saya hanya menunjukkan bahwa pilihan default berada di luar cakupan contoh ini.None
nilai akhirnyaGunakan
deque
ukuran 1.sumber
Jika Anda menggunakan Python 3.x:
jika Anda menggunakan python 2.7:
Catatan Samping:
Biasanya, solusi yang disajikan di atas adalah yang Anda butuhkan untuk kasus biasa, tetapi jika Anda berurusan dengan data dalam jumlah besar, lebih efisien menggunakan
deque
ukuran 1. ( sumber )sumber
*lst, last = some_iterable
._
adalah variabel khusus dalam python dan digunakan baik untuk menyimpan nilai terakhir atau untuk mengatakan saya tidak peduli tentang nilainya jadi bisa dibersihkan.Mungkin layak digunakan
__reversed__
jika tersediasumber
Sesederhana:
sumber
enumerate
mengembalikan(index, value)
seperti:(0, val0), (1, val1), (2, val2)
... dan kemudian secara defaultmax
ketika diberi daftar tupel, membandingkan hanya dengan nilai pertama tupel, kecuali dua nilai pertama sama, yang tidak pernah ada di sini karena mewakili indeks. Kemudian subskrip tambahan adalah karena max mengembalikan seluruh tupel (idx, nilai) sedangkan kita hanya tertarikvalue
. Ide yang menarik.Ini tidak mungkin lebih cepat daripada loop for yang kosong karena lambda, tapi mungkin ini akan memberi orang lain ide
Jika iter kosong, TypeError dimunculkan
sumber
TypeError
iterable kosong, Anda juga bisa memberikan nilai default melalui nilai awalreduce()
, misalnyalast = lambda iterable, default=None: reduce(lambda _, x: x, iterable, default)
.Ada ini
Jika panjang iterasi benar-benar epik - begitu lama sehingga mewujudkan daftar akan menghabiskan memori - maka Anda benar-benar perlu memikirkan ulang desainnya.
sumber
Saya akan menggunakan
reversed
, kecuali bahwa itu hanya membutuhkan urutan, bukan iterator, yang tampaknya agak sewenang-wenang.Dengan cara apa pun Anda melakukannya, Anda harus menjalankan seluruh iterator. Pada efisiensi maksimum, jika Anda tidak membutuhkan iterator lagi, Anda dapat membuang semua nilai:
Saya pikir ini adalah solusi yang kurang optimal.
sumber
The Toolz perpustakaan menyediakan solusi yang bagus:
Tetapi menambahkan ketergantungan non-inti mungkin tidak sepadan untuk digunakan hanya dalam kasus ini.
sumber
Lihat kode ini untuk sesuatu yang serupa:
http://excamera.com/sphinx/article-islast.html
Anda dapat menggunakannya untuk mengambil item terakhir dengan:
sumber
islast
dalam jawaban Anda (lihat meta.stackexchange.com/questions/8231/… ).Saya hanya akan menggunakan
next(reversed(myiter))
sumber
Pertanyaannya adalah tentang mendapatkan elemen terakhir dari sebuah iterator, tetapi jika iterator Anda dibuat dengan menerapkan kondisi ke suatu urutan, maka pembalikan dapat digunakan untuk menemukan "pertama" dari urutan terbalik, hanya dengan melihat elemen yang dibutuhkan, dengan menerapkan mundur ke urutan itu sendiri.
Contoh yang dibuat-buat,
sumber
Sebagai alternatif untuk iterator tak terbatas, Anda dapat menggunakan:
Saya pikir itu akan lebih lambat,
deque
tetapi secepat dan sebenarnya lebih cepat daripada untuk metode loop (entah bagaimana)sumber
Pertanyaannya salah dan hanya dapat menghasilkan jawaban yang rumit dan tidak efisien. Untuk mendapatkan iterator, Anda tentu saja memulai dari sesuatu yang dapat diulang, yang dalam banyak kasus menawarkan cara yang lebih langsung untuk mengakses elemen terakhir.
Setelah Anda membuat iterator dari iterable, Anda akan terjebak dalam melewati elemen, karena itulah satu-satunya hal yang disediakan oleh iterable.
Jadi, cara yang paling efisien dan jelas bukanlah dengan membuat iterator pada awalnya, tetapi menggunakan metode akses asli dari iterable.
sumber