Loop mundur menggunakan indeks dengan Python?

286

Saya mencoba untuk mengulang dari 100 menjadi 0. Bagaimana saya melakukan ini dengan Python?

for i in range (100,0) tidak bekerja

Joan Venge
sumber
9
BTW, Anda mungkin ingin mengulang dari 99 menjadi 0, dan jarang dari 100 menjadi 0. Ini memengaruhi jawaban.
Acumenus
1
@Acumenus Itulah yang saya cari ketika sampai di sini. Dan sebagai catatan solusinya adalah dengan hanya menulis: range(100)[::-1](yang secara otomatis diterjemahkan ke range(9, -1, -1)) - Diuji dalam python 3.7
Hassan

Jawaban:

399

Coba range(100,-1,-1), argumen ke-3 adalah selisih untuk digunakan (didokumentasikan di sini ).

("rentang" opsi, mulai, berhenti, langkah didokumentasikan di sini )

0x6adb015
sumber
3
Saya juga perlu menggunakan ini untuk menghapus item dari koleksi, jadi itu sebabnya hanya ingin indeks.
Joan Venge
2
argumen kedua kurang dari nilai akhir. jadi jika Anda meletakkan -1 maka rentang berhenti pada 0, jika Anda menempatkan -5, rentang berhenti di -4 (untuk selisih -1)
mulllhausen
200

Menurut pendapat saya, ini yang paling mudah dibaca:

for i in reversed(xrange(101)):
    print i,
Triptych
sumber
14
Ini lebih baik daripada jawaban yang diterima karena tidak benar-benar mengalokasikan semua angka dalam memori (dalam Python 3 jawaban yang diterima tidak akan baik), ditambah lebih jelas apa yang terjadi.
Blixt
5
Python sebelum 2.6 tidak mengalokasikan semua angka, karena dibalik tidak memiliki cara untuk memberitahu xrange untuk mundur ... (Sejak Python 2.6 ia memanggil __reversed __ ().)
Robert Siemer
Saya lebih suka reversed(xrange(len(list)))untuk xrange(len(list)-1:-1:-1); yang terakhir hanya terlihat aneh dengan begitu banyak -1.
musiphil
1
xrange () tidak tersedia lagi dalam Python 3
Chris Graf
1
Dalam Python 3, rangeberperilaku dengan cara yang sama seperti xrangedi 2.7. @hacksoi tergantung pada use case tetapi katakanlah Anda mengulangi mundur dalam buffer besar, katakanlah itu 10 MB, kemudian membuat indeks terbalik dimuka akan mengambil detik dan menggunakan lebih dari 50 MB memori. Menggunakan generator yang dibalik akan membutuhkan milidetik dan hanya menghabiskan beberapa byte memori.
Blixt
34
for i in range(100, -1, -1)

dan beberapa solusi yang sedikit lebih lama (dan lebih lambat):

for i in reversed(range(101))

for i in range(101)[::-1]
kcwu
sumber
16

Secara umum dengan Python, Anda bisa menggunakan indeks negatif untuk memulai dari belakang:

numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
    print numbers[-i - 1]

Hasil:

50
40
30
20
10
Blixt
sumber
8

Mengapa kode Anda tidak berfungsi

Kode Anda for i in range (100, 0)baik-baik saja, kecuali

parameter ketiga ( step) secara default +1. Jadi, Anda harus menentukan parameter ke-3 untuk rentang () -1untuk mundur.

for i in range(100, -1, -1):
    print(i)

CATATAN: Ini termasuk 100 & 0 dalam output.

Ada beberapa cara.

Cara yang lebih baik

Untuk cara pythonic, periksa PEP 0322 .

Ini adalah contoh python Python3 untuk mencetak dari 100 ke 0 (termasuk 100 & 0).

for i in reversed(range(101)):
    print(i)
pembuat kode mitos
sumber
1
ya, PEP-322 memberi kita cara yang jelas dan paling tidak rawan kesalahan untuk membalikkan iterasi.
Allen Shen
1
Ini bagus. Rekomendasi tentang bagaimana menerapkan reverseddalam PEP-322 menyesatkan, sehingga harus dicatat bahwa reversedakan memanggil __reversed__iterable dan mengembalikan hasilnya, dan untuk rangeobjek ini adalah range_objectiterator yang dievaluasi malas . Singkatnya: menggunakan metode ini evaluasi masih malas.
Ruzihm
5

Solusi lain:

z = 10
for x in range (z):
   y = z-x
   print y

Hasil:

10
9
8
7
6
5
4
3
2
1

Kiat: Jika Anda menggunakan metode ini untuk menghitung kembali indeks dalam daftar, Anda ingin -1 dari nilai 'y', karena indeks daftar Anda akan mulai dari 0.

Andy T.
sumber
3

Jawaban sederhana untuk menyelesaikan masalah Anda bisa seperti ini:

for i in range(100):
    k = 100 - i
    print(k)
dicantumkan
sumber
1

for var in range(10,-1,-1) bekerja

pengguna2220115
sumber
1

Pendek dan manis. Ini adalah solusi saya ketika melakukan kursus codeAcademy. Mencetak string dengan urutan rev.

def reverse(text):
    string = ""
    for i in range(len(text)-1,-1,-1):
        string += text[i]
    return string    
Mike
sumber
1

Anda selalu dapat melakukan peningkatan rentang dan kurangi dari variabel dalam kasus Anda di 100 - imana i in range( 0, 101 ).

for i in range( 0, 101 ):
    print 100 - i
pnoob
sumber
0

Saya mencoba ini di salah satu latihan codeacademy (membalikkan karakter dalam string tanpa menggunakan terbalik atau :: -1)

def reverse(text):
    chars= []
    l = len(text)
    last = l-1
    for i in range (l):
        chars.append(text[last])
        last-=1

    result= ""   
    for c in chars:
        result += c
    return result
print reverse('hola')
Tabula Rasa
sumber
0

Saya ingin mengulang dua daftar mundur pada saat yang sama sehingga saya memerlukan indeks negatif. Ini solusi saya:

a= [1,3,4,5,2]
for i in range(-1, -len(a), -1):
    print(i, a[i])

Hasil:

-1 2
-2 5
-3 4
-4 3
-5 1
Emanuel Lindström
sumber
0

Oh oke baca salah pertanyaan, saya kira ini tentang mundur dalam array? jika demikian, saya punya ini:

array = ["ty", "rogers", "smith", "davis", "tony", "jack", "john", "jill", "harry", "tom", "jane", "hilary", "jackson", "andrew", "george", "rachel"]


counter = 0   

for loop in range(len(array)):
    if loop <= len(array):
        counter = -1
        reverseEngineering = loop + counter
        print(array[reverseEngineering])
Darrell
sumber
Sepertinya jawaban Anda adalah salin dari tes yang Anda buat. Cobalah memposting contoh minimal: penggunaan globaldan timetidak relevan untuk pertanyaan awal.
Michael Doubez
-1

Anda juga dapat membuat mekanisme balik kustom dengan python. Yang dapat digunakan di mana saja untuk mengulang iterable mundur

class Reverse:
    """Iterator for looping over a sequence backwards"""
    def __init__(self, seq):
        self.seq = seq
        self.index = len(seq)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.seq[self.index]


>>> d = [1,2,3,4,5]
>>> for i in Reverse(d):
...   print(i)
... 
5
4
3
2
1
mohammed wazeem
sumber
-2
a = 10
for i in sorted(range(a), reverse=True):
    print i
boomba
sumber
Selamat Datang di Stack Overflow! Silakan pertimbangkan untuk mengedit posting Anda untuk menambahkan lebih banyak penjelasan tentang apa yang kode Anda lakukan dan mengapa itu akan menyelesaikan masalah. Jawaban yang sebagian besar hanya berisi kode (bahkan jika itu berfungsi) biasanya tidak akan membantu OP untuk memahami masalah mereka.
SuperBiasedMan
Anda menyadari bahwa menggunakan sortedtidak akan perlu menyimpan seluruh daftar dalam memori, kan? Ini boros dan tidak layak untuk ukuran besar a.
Acumenus