Python'daki endeksleri kullanarak geriye mi dönün?


286

Ben 100'den 0'a döngü çalışıyorum. Python bunu nasıl yapabilirim?

for i in range (100,0) çalışmıyor.


9
BTW, muhtemelen 99'dan 0'a ve nadiren 100'den 0'a döngü yapmak istiyorsunuz. Bu, cevapları etkiler.
Acumenus

1
@Acumenus Tam buraya ulaştığımda aradığım şey buydu. Ve kayıt için çözüm sadece yazmaktır: range(100)[::-1](otomatik olarak çevrilir range(9, -1, -1)) - Python
Hassan

Yanıtlar:


399

Deneyin range(100,-1,-1), üçüncü argüman kullanılacak artıştır ( burada belgelenmiştir ).

("aralık" seçenekleri, başlatma, durdurma, adım burada belgelenir )


3
Ayrıca koleksiyondaki öğeleri silmek için bunu kullanmalıyım, bu yüzden sadece endeksleri istedim.
Joan Venge

2
ikinci argüman nihai değerden bir daha azdır.
-1'i koyarsanız aralık 0'da

200

Benim düşünceme göre, bu en okunabilir olanı:

for i in reversed(xrange(101)):
    print i,

14
Bu, kabul edilen cevaptan daha iyidir çünkü bellekteki tüm sayıları tahsis etmez (Python 3'te kabul edilen cevap da olmaz), ayrıca ne olduğu daha açıktır.
Blixt

5
2.6'dan önceki Python tüm sayıları tahsis eder, çünkü tersine çevrilmiş olan xrange'e geriye gitmesini söylemenin bir yolu yoktur ... (Python 2.6'dan beri __reversed __ () olarak adlandırır.)
Robert

Ben tercih reversed(xrange(len(list)))etmek xrange(len(list)-1:-1:-1); ikincisi çok fazla garip görünüyor -1.
musiphil

1
xrange () artık Python 3'te mevcut değil
Chris Graf

1
Python 3'te 2.7'de rangeolduğu gibi davranır xrange. @hacksoi, kullanım durumuna bağlıdır, ancak diyelim ki büyük bir arabellekte geriye doğru yinelediğinizi varsayalım, diyelim ki 10 MB. Ters bir jeneratör kullanmak milisaniye alır ve sadece birkaç bayt bellek kullanır.
Blixt

34
for i in range(100, -1, -1)

ve biraz daha uzun (ve daha yavaş) bir çözüm:

for i in reversed(range(101))

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

16

Genellikle Python'da, arkadan başlamak için negatif indeksler kullanabilirsiniz:

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

Sonuç:

50
40
30
20
10

8

Kodunuz neden çalışmadı

Kodunuz for i in range (100, 0)iyi, hariç

üçüncü parametre ( step) varsayılan olarakdır +1. Bu nedenle, -1geriye doğru adım olarak range () için 3. parametreyi belirtmeniz gerekir .

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

NOT: Bu çıkışta 100 ve 0 içerir.

Birden çok yol var.

Daha iyi yol

Pitonik yol için PEP 0322'yi kontrol edin .

Bu 100'den 0'a (100 ve 0 dahil) yazdırmak için Python3 pythonic örneğidir.

for i in reversed(range(101)):
    print(i)

1
evet, PEP-322 bize yinelemeleri tersine çevirmek için açık ve en az hataya açık bir yol sunar.
Allen Shen

1
Bu iyi. reversedPEP-322'de nasıl uygulanacağı tavsiyesi yanıltıcıdır, bu nedenle tekrarlanabilir reversedçağrıyı __reversed__çağıracak ve sonucu döndürecek ve rangenesneler için bu tembel bir değerlendirilmiş range_objectyineleyicidir. Kısacası: bu yöntemi kullanmak hala tembel bir değerlendirmedir.
Ruzihm

5

Başka bir çözüm:

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

Sonuç:

10
9
8
7
6
5
4
3
2
1

İpucu: Bir listedeki indeksleri geri saymak için bu yöntemi kullanıyorsanız, liste indeksleriniz 0'dan başlayacağından, 'y' değerinden -1 almak istersiniz.


3

Sorununuzu çözmek için basit bir cevap şöyle olabilir:

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


1

Kısa ve güzel. CodeAcademy kursu yaparken benim çözümüm buydu. Bir dizeyi rev sırayla yazdırır.

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

1

Hep artan aralığını yapmak ve sizin durumunuzda bir değişken çıkarma olabilir 100 - inerede i in range( 0, 101 ).

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

0

Bunu codeacademy egzersizlerinden birinde denedim (tersine ne de :: -1 kullanmadan bir dizede ters karakterleri)

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

Negatif indeks gerekiyordu bu yüzden aynı anda iki liste üzerinden döngü istedim. Bu benim çözümüm:

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

Sonuç:

-1 2
-2 5
-3 4
-4 3
-5 1

0

Oh tamam soruyu yanlış okudum, sanırım bir dizide geriye gitmekle ilgili? eğer öyleyse, ben var:

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

Cevabınız, yaptığınız testin kopya pastası gibi görünüyor. Lütfen asgari bir örnek göndermeye çalışın: inital sorunun kullanımı globalve timeönemli değildir.
Michael Doubez

-1

Python'da özel bir ters mekanizma da oluşturabilirsiniz. Hangi tekrarlanabilir bir geriye döngü için herhangi bir yerde kullanılabilir

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

Stack Overflow'a hoş geldiniz! Kodunuzun ne yaptığı ve sorunun neden çözüleceği hakkında daha fazla açıklama eklemek için lütfen yayınınızı düzenleyin. Çoğunlukla sadece kod içeren bir yanıt (çalışıyor olsa bile) genellikle OP'nin sorunlarını anlamalarına yardımcı olmaz.
SuperBiasedMan

Kullanmanın sortedtüm listeyi gereksiz yere bellekte saklayacağını biliyorsunuz, değil mi? Bu israftır ve büyük olanlar için uygun değildir a.
Acumenus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.