Jadi saya bisa mulai len(collection)
dan mengakhiri collection[0]
.
Saya juga ingin dapat mengakses indeks loop.
Gunakan reversed()
fungsi bawaan:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
Untuk juga mengakses indeks asli, gunakan enumerate()
pada daftar Anda sebelum meneruskannya ke reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
Karena enumerate()
mengembalikan generator dan generator tidak dapat dibatalkan, Anda perlu mengubahnya menjadi yang list
pertama.
reversed()
jangan modifikasi daftar.reversed()
tidak membuat salinan dari daftar (jika tidak maka akan membutuhkan memori tambahan O (N)). Jika Anda perlu mengubah penggunaan daftaralist.reverse()
; jika Anda memerlukan salinan daftar dalam penggunaan terbalik urutanalist[::-1]
.Anda dapat melakukan:
(Atau apa pun yang ingin Anda lakukan dalam for loop.)
The
[::-1]
slice membalikkan daftar di untuk loop (tetapi tidak akan benar-benar mengubah daftar Anda "permanen").sumber
[::-1]
membuat salinan yang dangkal, oleh karena itu array tidak mengubah "permanen" atau "sementara".0
, mungkin-1
, jadi berakhir di awal ) dan langkah :-1
(beralih mundur melalui daftar,1
item sekaligus).reversed()
Jika Anda memerlukan indeks loop, dan tidak ingin melintasi seluruh daftar dua kali, atau menggunakan memori tambahan, saya akan menulis generator.
sumber
reversed(xrange(len(L)))
menghasilkan indeks yang sama denganxrange(len(L)-1, -1, -1)
.for index, item in enumerate(reversed(L)): print len(L)-1-index, item
Itu bisa dilakukan seperti ini:
Jadi tebakan Anda cukup dekat :) Sedikit canggung tetapi pada dasarnya mengatakan: mulai dengan 1 kurang dari
len(collection)
, teruskan sampai Anda tiba tepat sebelum -1, dengan langkah-langkah -1.Fyi,
help
fungsi ini sangat berguna karena memungkinkan Anda melihat dokumen untuk sesuatu dari konsol Python, misalnya:help(range)
sumber
-1
. Saya hanya akan mengatakanreversed(xrange(len(collection)))
Fungsi
reversed
bawaan berguna:The dokumentasi untuk terbalik menjelaskan keterbatasan.
Untuk kasus-kasus di mana saya harus menjalankan urutan secara terbalik bersama dengan indeks (misalnya untuk modifikasi di tempat mengubah panjang urutan), saya memiliki fungsi ini mendefinisikan modul codeutil saya:
Yang ini menghindari membuat salinan urutan. Jelas,
reversed
batasannya masih berlaku.sumber
Bagaimana tanpa membuat ulang daftar baru, Anda dapat melakukannya dengan mengindeks:
ATAU
sumber
ATAU
sumber
Saya suka pendekatan generator satu-liner:
sumber
Anda juga dapat menggunakan fungsi "rentang" atau "menghitung". Sebagai berikut:
Anda juga dapat menggunakan "count" dari itertools sebagai berikut:
sumber
3 foo\n2 bar\n1 baz
Gunakan
list.reverse()
dan kemudian beralih seperti biasa.http://docs.python.org/tutorial/datastructures.html
sumber
Pendekatan tanpa impor:
atau
sumber
sumber
untuk apa pun itu layak Anda dapat melakukannya seperti ini juga. sangat sederhana.
sumber
print a[-(x+1)]
dan menghindari penugasan kembali indeks dalam tubuh loop.Cara ekspresif untuk mencapai
reverse(enumerate(collection))
dalam python 3:dalam python 2:
Saya tidak yakin mengapa kami tidak memiliki tulisan cepat untuk ini, misalnya:
atau mengapa kita tidak punya
reversed_range()
sumber
Jika Anda memerlukan indeks dan daftar Anda kecil, cara yang paling mudah dibaca adalah dengan melakukan
reversed(list(enumerate(your_list)))
seperti kata jawaban yang diterima. Tetapi ini membuat salinan daftar Anda, jadi jika daftar Anda mengambil sebagian besar memori Anda, Anda harus mengurangi indeks yang dikembalikan olehenumerate(reversed())
darilen()-1
.Jika Anda hanya perlu melakukannya sekali:
atau jika Anda perlu melakukan ini beberapa kali, Anda harus menggunakan generator:
sumber
fungsi sebaliknya sangat berguna di sini:
sumber
Anda juga dapat menggunakan
while
loop:sumber
Anda dapat menggunakan indeks negatif dalam loop biasa:
Untuk mengakses indeks seolah-olah Anda beralih ke depan atas salinan koleksi yang terbalik, gunakan
i - 1
:Untuk mengakses indeks asli yang tidak dibalik, gunakan
len(collection) - i
:sumber
Jika Anda tidak keberatan indeksnya negatif, Anda dapat melakukan:
sumber
Saya pikir cara paling elegan adalah mengubah
enumerate
danreversed
menggunakan generator berikutyang menghasilkan kebalikan dari
enumerate
iteratorContoh:
Hasil:
sumber
Jawaban lainnya baik, tetapi jika Anda ingin melakukan gaya daftar List
sumber
Untuk menggunakan indeks negatif: mulai dari -1 dan mundur -1 pada setiap iterasi.
sumber
Cara sederhana:
sumber
saya pikir yang satu ini juga cara mudah untuk melakukannya ... baca dari akhir dan terus menurun sampai panjang daftar, karena kita tidak pernah menjalankan indeks "akhir" maka ditambahkan -1 juga
sumber
Dengan asumsi tugas adalah untuk menemukan elemen terakhir yang memenuhi beberapa kondisi dalam daftar (yaitu pertama ketika melihat ke belakang), saya mendapatkan nomor berikut:
Jadi, opsi paling jelek
xrange(len(xs)-1,-1,-1)
adalah yang tercepat.sumber
Anda dapat menggunakan generator:
akhirnya:
semoga ini membantu anda.
sumber