2011-09-02 26 views

Trả lời

361

sử dụng reversed() chức năng:

reversed(range(10)) 

Đó là nhiều hơn nữa ý nghĩa.

Cập nhật:

Nếu bạn muốn nó được một danh sách (như BTK chỉ ra):

list(reversed(range(10))) 

Cập nhật:

Nếu bạn muốn sử dụng chỉ range để đạt được cùng một kết quả, bạn có thể sử dụng tất cả các tham số của nó. range(start, stop, step)

Ví dụ, để tạo ra một danh sách [5,4,3,2,1,0], bạn có thể sử dụng như sau:

range(5, -1, -1) 

Nó có thể ít trực quan nhưng như các ý kiến ​​đề cập, đây là hiệu quả hơn và việc sử dụng đúng phạm vi cho đảo ngược danh sách.

+12

Mặc dù nó 'kém hiệu quả'. Và bạn không thể cắt hoạt động trên đó. –

+4

@Jakob. Điểm tốt. +1. Chúng ta đều học hỏi lẫn nhau mỗi ngày ... :-) –

+3

Điều này cũng sẽ tạo ra một danh sách từ 8 xuống 0, thay vì 9 đến 0. –

279

Sử dụng chức năng tích hợp 'phạm vi'. Chữ ký là range(start, stop, step). Điều này tạo ra một chuỗi mang lại số, bắt đầu bằng start và kết thúc nếu đạt được stop, ngoại trừ stop.

>>> range(9,-1,-1) 
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
>>> range(-2, 6, 2) 
    [-2, 0, 2, 4] 

Trong Python 3, điều này tạo ra một đối tượng phi danh sách range, có chức năng một cách hiệu quả như một danh sách chỉ đọc (nhưng sử dụng cách ít bộ nhớ, đặc biệt là cho các phạm vi lớn).

+1

Bạn có thể giải thích điều này, bạn có thể giới thiệu cho tôi bất kỳ trang web/pdf nào cho python –

+8

@ramesh Nếu bạn chạy 'help (range)' trong một shell python, nó sẽ cho bạn biết các đối số. Chúng là con số để bắt đầu, số để kết thúc (độc quyền), và bước cần thực hiện, vì vậy nó bắt đầu từ 9 và trừ 1 cho đến khi nó đến -1 (tại thời điểm đó nó dừng lại mà không quay trở lại, đó là lý do tại sao phạm vi kết thúc tại 0) –

+3

@ ramesh.mimit: Chỉ cần truy cập trang web Python chính thức. Có tài liệu đầy đủ ở đó, bao gồm một hướng dẫn tuyệt vời. –

1
range(9,0,-1) 
[9, 8, 7, 6, 5, 4, 3, 2, 1] 
+12

Câu trả lời của bạn cho thấy lý do tại sao 'đảo ngược (phạm vi (10))' ít bị lỗi hơn. Không có vi phạm Asinox. Chỉ là một quan sát trung thực. –

+0

Tôi không biết nếu nó là tiêu chuẩn để lại câu trả lời sai lầm trên màn hình. Tôi có thể hoặc ai đó sửa chữa hoặc thậm chí loại bỏ nó? – sinekonata

+2

@sine, nope chỉ để lại nó và tự hỏi làm thế nào nó tích lũy 3 upvotes ... Tôi cho rằng bạn có thể gắn cờ cho sự chú ý của người điều hành (trùng lặp của [answer] (http://stackoverflow.com/a/7286366/2742805) từ 18 tháng trước, ngoại trừ bị hỏng), không chắc họ có xóa nó hay không. – OGHaza

33

Bạn có thể sử dụng range(10)[::-1] đó là điều tương tự như range(9, -1, -1) và cho là dễ đọc hơn (nếu bạn đã quen thuộc với các chung sequence[::-1] Python thành ngữ).

-1
range(9,-1,-1) 
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

Biểu mẫu chính xác. Nếu bạn sử dụng

reversed(range(10)) 

bạn sẽ không nhận được 0 trường hợp. Ví dụ: giả sử 10 của bạn không phải là số ma thuật và biến bạn đang sử dụng để tra cứu bắt đầu từ ngược lại. Nếu trường hợp n của bạn là 0, đảo ngược (phạm vi (0)) sẽ không thực thi mà là sai nếu bạn tình cờ có một đối tượng duy nhất trong chỉ số không.

5

Yêu cầu trong câu hỏi này yêu cầu số list của các số nguyên có kích thước 10 theo thứ tự giảm dần . Vì vậy, chúng ta hãy tạo một danh sách trong python.

# This meets the requirement. 
# But it is a bit harder to wrap one's head around this. right? 
>>> range(10-1, -1, -1) 
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

# let's find something that is a bit more self-explanatory. Sounds good? 
# ---------------------------------------------------- 

# This returns a list in ascending order. 
# Opposite of what the requirement called for. 
>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

# This returns an iterator in descending order. 
# Doesn't meet the requirement as it is not a list. 
>>> reversed(range(10)) 
<listreverseiterator object at 0x10e14e090> 

# This returns a list in descending order and meets the requirement 
>>> list(reversed(range(10))) 
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
+2

Tôi thực sự thích ** ba '-1' ** Đó chính xác là * mẫu này * giúp dễ dàng giữ *' quấn đầu quanh cái này '* - Hôm nay tôi biết rằng nếu nó thực sự * phải hiệu quả * , sử dụng 'phạm vi (n-1, -1, -1)' khi di chuyển một phạm vi theo thứ tự đảo ngược. – Wolf

0

Sử dụng mà không cần [:: - 1] hoặc đảo ngược -

def reverse(text): 
    result = [] 
    for index in range(len(text)-1,-1,-1): 
     c = text[index] 
     result.append(c) 
    return ''.join(result) 

print reverse("python!") 
+4

Tại sao một người nào đó nên viết thư này thay vì '" python! "[:: - 1]'? – Daniel

0
[9-i for i in range(10)] 
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
2

tôi tin rằng điều này có thể giúp đỡ,

range(5)[::-1] 

dưới đây là Cách sử dụng:

for i in range(5)[::-1]: 
    print i 
6

Readibility sang một bên, reversed(range(n)) có vẻ nhanh hơn range(n)[::-1].

$ python -m timeit "reversed(range(1000000000))" 
1000000 loops, best of 3: 0.598 usec per loop 
$ python -m timeit "range(1000000000)[::-1]" 
1000000 loops, best of 3: 0.945 usec per loop 

Chỉ cần nếu có ai đã tự hỏi :)

+0

tốt để có một số số :) - tại sao bạn không thêm 'phạm vi (1000000000-1, -1, -1)' là tốt? – Wolf

+0

... tốt hơn không thử 'khoảng thời gian (1000000000-1, -1, -1)' trên dòng lệnh, thay vào đó hãy xem [kết quả của tôi] (https://stackoverflow.com/a/44519681/2932052) :-) – Wolf

8
for i in range(8, 0, -1) 

sẽ giải quyết vấn đề này. Nó sẽ xuất ra 8 đến 1 và -1 có nghĩa là danh sách được đảo ngược

5

Không có phương pháp nào có thể trả về danh sách đảo ngược.

Khi bạn có lặp trên n các mặt hàng và muốn thay thế thứ tự của danh sách được trả về bởi range(start, stop, step) bạn phải sử dụng tham số thứ ba phạm vi trong đó xác định step và đặt nó vào -1, các thông số khác sẽ được điều chỉnh cho phù hợp:

  1. Cung cấp dừng tham số như -1 (giá trị trước đó của stop - 1, stop là bằng 0).
  2. Khi sử dụng tham số bắt đầu n-1.

Vì vậy, tương đương với phạm vi (n) theo thứ tự ngược sẽ là:

n = 10 
print range(n-1,-1,-1) 
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
+2

Thành thật mà nói tôi thấy điều này ít trực quan hơn 'đảo ngược (n)' –

+1

@NicholasHamilton Đồng ý với bạn, tuy nhiên ý tưởng đằng sau câu trả lời đó là sử dụng ít tài nguyên hơn ... (và câu hỏi là chỉ sử dụng chức năng phạm vi :)) –

+0

Ok, đừng lo, tôi đoán nó phụ thuộc vào tình hình. Ví dụ, nếu chức năng phạm vi được sử dụng làm chỉ mục cho một vòng lặp, thì nó sẽ có hiệu lực hạn chế, tuy nhiên, nếu nó được sử dụng bên trong một vòng lặp bên ngoài, thì chi phí sẽ ... –

0

Bạn không nhất thiết cần phải sử dụng chức năng phạm vi, bạn chỉ có thể làm danh sách [:: - 1] đó nên trả lại danh sách theo thứ tự đảo ngược nhanh chóng, mà không cần sử dụng bất kỳ bổ sung nào.

+0

Đây có vẻ là giải pháp được đề xuất trong [câu trả lời trước] (http://stackoverflow.com/a/21714738/1072229). Nó cũng xuất hiện mà bạn có thể đang cố gắng để bình luận về một câu trả lời trước khác nhau - bạn sẽ cần phải nhận được một chút danh tiếng hơn trước khi bạn có thể làm điều đó. –

1

Bạn có thể làm in ấn các số ngược lại với phạm vi() BIF Giống như,

for number in range (10 , 0 , -1) : 
    print (number) 

Output sẽ [10,9,8,7,6,5,4,3,2,1]

phạm vi() - phạm vi (bắt đầu, kết thúc, tăng/giảm) nơi bắt đầu là bao gồm, cuối cùng là độc quyền và tăng thể được bất kỳ số và hoạt động như bước

3

Đối với những người quan tâm đến "hiệu quả "của các tùy chọn được thu thập cho đến nay ...

Jaime RGP's answer dẫn tôi đến khởi động lại máy tính của tôi sau khithời gian đề nghị hơi "thách thức" giải pháp của Jason nghĩa sau đây của riêng tôi (thông qua bình luận). Để dành ra một số tò mò của bạn thời gian chết, tôi trình bày ở đây kết quả của tôi (xấu nhất đầu tiên):

Jason's answer (có thể chỉ là một chuyến tham quan vào sức mạnh của list comprehension):

$ python -m timeit "[9-i for i in range(10)]" 
1000000 loops, best of 3: 1.54 usec per loop 

martineau's answer (có thể đọc được nếu bạn là quen thuộc với extended slices syntax):

$ python -m timeit "range(10)[::-1]" 
1000000 loops, best of 3: 0.743 usec per loop 

Michał Šrajer's answer (được chấp nhận một, rất có thể đọc được):

$ python -m timeit "reversed(range(10))" 
1000000 loops, best of 3: 0.538 usec per loop 

bene's answer (đầu tiên, nhưng rất sơ sài at that time sự):

$ python -m timeit "range(9,-1,-1)" 
1000000 loops, best of 3: 0.401 usec per loop 

Tùy chọn cuối cùng là dễ nhớ bằng cách sử dụng range(n-1,-1,-1) ký hiệu bởi Val Neekman.

0

Giả sử bạn có một danh sách gọi nó là a = {1,2,3,4,5} Bây giờ nếu bạn muốn in danh sách ngược lại thì chỉ cần sử dụng mã sau đây.

a.reverse 
for i in a: 
    print(i) 

Tôi biết bạn đã hỏi sử dụng dải nhưng đã được trả lời.

Các vấn đề liên quan