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


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 )


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,

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]

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

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)

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.


3

Jawaban sederhana untuk menyelesaikan masalah Anda bisa seperti ini:

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


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    

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

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

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

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

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

-2
a = 10
for i in sorted(range(a), reverse=True):
    print i

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.