Lặp lại bằng cách sử dụng các chỉ số trong Python?


286

Tôi đang cố gắng lặp từ 100 đến 0. Làm thế nào để tôi làm điều này trong Python?

for i in range (100,0) không hoạt động.


9
BTW, bạn có thể muốn lặp từ 99 đến 0 và hiếm khi từ 100 đến 0. Điều này ảnh hưởng đến câu trả lời.
Acumenus

1
@Acumenus Đó chính xác là những gì tôi đã tìm kiếm khi đến đây. Và đối với bản ghi, giải pháp chỉ đơn giản là viết: range(100)[::-1](được dịch tự động sang range(9, -1, -1)) - Đã thử nghiệm trong python 3.7
Hassan

Câu trả lời:


398

Hãy thử range(100,-1,-1), đối số thứ 3 là mức tăng để sử dụng (tài liệu ở đây ).

(Tùy chọn "phạm vi", bắt đầu, dừng, bước được ghi lại ở đây )


3
Ngoài ra tôi cần sử dụng điều này để xóa các mục khỏi bộ sưu tập, vì vậy đó là lý do tại sao chỉ muốn các chỉ số.
Joan Venge

2
đối số thứ hai là một ít hơn giá trị cuối cùng. vì vậy nếu bạn đặt -1 thì phạm vi dừng ở 0, nếu bạn đặt -5, phạm vi dừng ở -4 (với mức tăng -1)
mulllhausen

200

Theo tôi, đây là thứ dễ đọc nhất:

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

14
Điều này tốt hơn câu trả lời được chấp nhận vì nó không thực sự phân bổ tất cả các số trong bộ nhớ (trong Python 3, câu trả lời được chấp nhận sẽ không), cộng với điều rõ ràng hơn là những gì đang xảy ra.
Blixt

5
Python trước 2.6 không phân bổ tất cả các số, vì đảo ngược không có cách nào để nói xrange đi ngược lại ... (Vì Python 2.6 nó gọi __Vversed __ ().)
Robert Siemer

Tôi thích reversed(xrange(len(list)))để xrange(len(list)-1:-1:-1); cái sau trông có vẻ kỳ lạ với rất nhiều -1.
musiphil

1
xrange () không còn khả dụng nữa trong Python 3
Chris Graf

1
Trong Python 3, rangehành xử giống như xrangetrong 2.7. @hacksoi tùy thuộc vào trường hợp sử dụng, nhưng giả sử bạn đang lặp lại trong một bộ đệm lớn, giả sử là 10 MB, sau đó tạo các chỉ số ngược trước sẽ mất vài giây và sử dụng hơn 50 MB bộ nhớ. Sử dụng một trình tạo đảo ngược sẽ mất một phần nghìn giây và chỉ sử dụng một vài byte bộ nhớ.
Blixt

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

và một số giải pháp hơi dài (và chậm hơn):

for i in reversed(range(101))

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

16

Nói chung trong Python, bạn có thể sử dụng các chỉ số phủ định để bắt đầu từ phía sau:

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

Kết quả:

50
40
30
20
10

8

Tại sao mã của bạn không hoạt động

Mã của bạn for i in range (100, 0)là tốt, ngoại trừ

tham số thứ ba ( step) theo mặc định +1. Vì vậy, bạn phải chỉ định tham số thứ 3 cho phạm vi () là -1bước lùi.

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

LƯU Ý: Điều này bao gồm 100 & 0 ở đầu ra.

Có nhiều cách.

Cách tốt hơn

Đối với cách pythonic, kiểm tra PEP 0322 .

Đây là ví dụ pythonic của Python3 để in từ 100 đến 0 (bao gồm 100 & 0).

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

1
có, PEP-322 cung cấp cho chúng ta một cách rõ ràng và ít xảy ra lỗi nhất để đảo ngược các lần lặp.
Allen Shen

1
Điều này là tốt Khuyến cáo về cách triển khai reversedtrong PEP-322 là sai lệch, do đó, cần lưu ý rằng reversedsẽ gọi __reversed__vào vòng lặp và trả về kết quả, và đối với rangecác đối tượng, đây là range_objecttrình lặp được đánh giá lười biếng . Tóm lại: sử dụng phương pháp này vẫn lười đánh giá.
Ruzihm

5

Giải pháp khác:

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

Kết quả:

10
9
8
7
6
5
4
3
2
1

Mẹo: Nếu bạn đang sử dụng phương pháp này để đếm lại các chỉ mục trong danh sách, bạn sẽ muốn -1 từ giá trị 'y', vì các chỉ mục danh sách của bạn sẽ bắt đầu từ 0.


3

Câu trả lời đơn giản để giải quyết vấn đề của bạn có thể như thế này:

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


1

Ngắn và ngọt. Đây là giải pháp của tôi khi thực hiện khóa học codeAcademy. In một chuỗi theo thứ tự rev.

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

1

Bạn luôn có thể làm phạm vi ngày càng tăng và trừ từ một biến trong trường hợp của bạn 100 - iở đâu i in range( 0, 101 ).

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

0

Tôi đã thử điều này trong một trong các bài tập về codeacademy (đảo ngược ký tự trong chuỗi mà không sử dụng đảo ngược cũng không :: -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

Tôi muốn lặp qua hai danh sách ngược cùng một lúc nên tôi cần chỉ số âm. Đây là giải pháp của tôi:

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

Kết quả:

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

0

Oh okay đọc câu hỏi sai, tôi đoán đó là về việc lạc hậu trong một mảng? nếu vậy, tôi có cái này:

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

Có vẻ như câu trả lời của bạn là bản sao dán của bài kiểm tra bạn đã thực hiện. Vui lòng thử đăng một ví dụ tối thiểu: việc sử dụng globaltimekhông liên quan đến câu hỏi bẩm sinh.
Michael Doubez

-1

Bạn cũng có thể tạo một cơ chế đảo ngược tùy chỉnh trong python. Mà có thể được sử dụng bất cứ nơi nào để lặp lại một vòng lặp ngược

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

Chào mừng bạn đến với Stack Overflow! Vui lòng xem xét chỉnh sửa bài đăng của bạn để thêm giải thích về những gì mã của bạn làm và lý do tại sao nó sẽ giải quyết vấn đề. Một câu trả lời chủ yếu chỉ chứa mã (ngay cả khi nó hoạt động) thường không giúp OP hiểu vấn đề của họ.
SuperBiasedMan

Bạn nhận ra rằng việc sử dụng sortedsẽ không cần lưu trữ toàn bộ danh sách trong bộ nhớ, phải không? Điều này là lãng phí và không khả thi cho lớn a.
Acumenus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.