วนกลับไปข้างหลังโดยใช้ดัชนีใน Python หรือไม่


286

ฉันพยายามวนจาก 100 เป็น 0 ฉันจะทำสิ่งนี้ใน Python ได้อย่างไร

for i in range (100,0) ไม่ทำงาน


9
BTW คุณอาจต้องการวนจาก 99 ถึง 0 และไม่ค่อยจาก 100 เป็น 0 ซึ่งมีผลต่อคำตอบ
คิวเมนตัส

1
@Acumenus นั่นคือสิ่งที่ฉันค้นหาเมื่อมาถึงที่นี่ และสำหรับการบันทึกการแก้ปัญหาคือการเขียน: range(100)[::-1](ซึ่งแปลโดยอัตโนมัติเป็นrange(9, -1, -1)) - ทดสอบใน python 3.7
Hassan

คำตอบ:


399

ลองใช้range(100,-1,-1)อาร์กิวเมนต์ที่ 3 เป็นการเพิ่มขึ้นเพื่อใช้ (บันทึกไว้ที่นี่ )

(ตัวเลือก "ช่วง" เริ่มต้นหยุดขั้นตอนมีการบันทึกไว้ที่นี่ )


3
นอกจากนี้ฉันต้องใช้สิ่งนี้เพื่อลบรายการออกจากคอลเลกชันด้วยเหตุนี้จึงเป็นเพียงแค่ต้องการดัชนี
Joan Venge

2
อาร์กิวเมนต์ที่สองคือหนึ่งน้อยกว่าค่าสุดท้าย ดังนั้นถ้าคุณใส่ -1 แล้วช่วงหยุดที่ 0, ถ้าคุณใส่ -5, ช่วงหยุดที่ -4 (สำหรับการเพิ่มขึ้นของ -1)
mulllhausen

200

ในความคิดของฉันนี้เป็นอ่านมากที่สุด:

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

14
นี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับเพราะมันไม่ได้จัดสรรจำนวนทั้งหมดในหน่วยความจำ (ใน Python 3 คำตอบที่ยอมรับจะไม่เหมือนกัน) รวมทั้งจะเห็นได้ชัดว่าเกิดอะไรขึ้น
Blixt

5
Python ก่อน 2.6 จัดสรรตัวเลขทั้งหมดเนื่องจากการกลับรายการไม่มีวิธีที่จะบอกให้ xrange ย้อนกลับ ... (ตั้งแต่ Python 2.6 เรียกว่า __reversed __ ())
Robert Siemer

ฉันชอบที่reversed(xrange(len(list)))จะxrange(len(list)-1:-1:-1); หลังเพียงแค่รูปลักษณ์ที่แปลกมีจำนวนมากดังนั้น-1's
musiphil

1
xrange () ไม่สามารถใช้ได้อีกใน Python 3
Chris Graf

1
ใน Python 3 rangeทำงานแบบเดียวกับxrange2.7 @hacksoi ขึ้นอยู่กับกรณีการใช้งาน แต่สมมติว่าคุณกำลังวนซ้ำแบบย้อนกลับในบัฟเฟอร์ขนาดใหญ่สมมติว่ามันคือ 10 MB จากนั้นการสร้างดัชนีย้อนกลับล่วงหน้าจะใช้เวลาไม่กี่วินาทีและใช้หน่วยความจำมากกว่า 50 MB การใช้ตัวสร้างที่กลับด้านจะใช้เวลามิลลิวินาทีและใช้หน่วยความจำไม่กี่ไบต์เท่านั้น
Blixt

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

และโซลูชันที่ยาวขึ้นเล็กน้อย (และช้ากว่า):

for i in reversed(range(101))

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

16

โดยทั่วไปใน Python คุณสามารถใช้ดัชนีลบเพื่อเริ่มต้นจากด้านหลัง:

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

ผลลัพธ์:

50
40
30
20
10

8

ทำไมรหัสของคุณใช้งานไม่ได้

คุณใช้รหัสfor i in range (100, 0)ได้ดียกเว้น

พารามิเตอร์ที่สาม ( step) +1เป็นค่าเริ่มต้น ดังนั้นคุณต้องระบุพารามิเตอร์ที่ 3 ถึง range () -1เพื่อย้อนกลับ

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

หมายเหตุ: นี่รวม 100 & 0 ในผลลัพธ์

มีหลายวิธี

ทางที่ดีกว่า

หาวิธี pythonic ตรวจสอบPEP 0322

นี่คือตัวอย่างของ Python3 pythonic ที่จะพิมพ์จาก 100 เป็น 0 (รวมถึง 100 & 0)

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

1
ใช่ PEP-322 ทำให้เรามีวิธีที่ชัดเจนและผิดพลาดน้อยที่สุดในการสลับการวนซ้ำ
อัลเลน Shen

1
ดีจัง. ข้อเสนอแนะของวิธีการที่จะดำเนินการreversedใน PEP-322 เป็นความเข้าใจผิดดังนั้นจึงควรจะตั้งข้อสังเกตว่าreversedจะเรียก__reversed__ใน iterable และกลับผลและสำหรับrangeวัตถุนี้เป็นการประเมินขี้เกียจrange_objectiterator กล่าวโดยย่อ: การใช้วิธีนี้ยังเป็นการประเมินผลที่ขี้เกียจ
Ruzihm

5

ทางออกอื่น:

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

ผลลัพธ์:

10
9
8
7
6
5
4
3
2
1

เคล็ดลับ: หากคุณใช้วิธีนี้เพื่อนับดัชนีย้อนกลับในรายการคุณจะต้อง -1 จากค่า 'y' เนื่องจากดัชนีรายการของคุณจะเริ่มต้นที่ 0


3

คำตอบง่ายๆในการแก้ปัญหาของคุณอาจเป็นเช่นนี้:

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


1

สั้นและหวาน นี่เป็นวิธีการแก้ปัญหาของฉันเมื่อทำหลักสูตรรหัสวิชา พิมพ์สตริงตามลำดับรอบ

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

1

คุณสามารถทำช่วงที่เพิ่มขึ้นและลบออกจากตัวแปรในกรณีของคุณที่ 100 - ii in range( 0, 101 )

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

0

ฉันลองสิ่งนี้ในหนึ่งในแบบฝึกหัด codeacademy (การย้อนตัวอักษรในสตริงโดยไม่ใช้ reverse หรือ :: -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

ฉันต้องการวนซ้ำสองรายการย้อนหลังในเวลาเดียวกันดังนั้นฉันต้องการดัชนีเชิงลบ นี่คือทางออกของฉัน:

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

ผลลัพธ์:

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

0

โอ้โอเคอ่านคำถามผิดฉันคิดว่ามันเกี่ยวกับการย้อนกลับในแถวลำดับ? ถ้าเป็นเช่นนั้นฉันมีสิ่งนี้:

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

ดูเหมือนว่าคำตอบของคุณคือสำเนาการทดสอบที่คุณทำ โปรดลองโพสต์ตัวอย่างเล็กน้อย: การใช้globalและtimeไม่เกี่ยวข้องกับคำถาม inital
Michael Doubez

-1

คุณยังสามารถสร้างกลไกการย้อนกลับที่กำหนดเองในหลาม ซึ่งสามารถใช้งานได้ทุกที่ในการวนซ้ำด้านหลัง

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! โปรดพิจารณาแก้ไขโพสต์ของคุณเพื่อเพิ่มคำอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่รหัสของคุณทำและสาเหตุที่มันแก้ไขปัญหา คำตอบที่ส่วนใหญ่มีรหัส (แม้ว่าจะใช้งานได้) มักจะไม่ช่วยให้ OP เข้าใจปัญหาของพวกเขา
SuperBiasedMan

คุณตระหนักดีว่าการใช้งานsortedนั้นไม่จำเป็นต้องเก็บรายชื่อทั้งหมดไว้ในหน่วยความจำใช่ไหม? aนี่คือสิ้นเปลืองและไม่เป็นไปได้ขนาดใหญ่
คิวเมนตัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.