2014-06-18 10 views
8

Làm thế nào để làm cho hàm enumerate của Python liệt kê từ các số lớn hơn đến thấp hơn (thứ tự giảm dần, giảm, đếm ngược)? Hoặc nói chung, làm thế nào để sử dụng tăng/giảm bước khác nhau trong enumerate?Python liệt kê xuống dưới hoặc với một bước tùy chỉnh

Ví dụ: chức năng như vậy, được áp dụng cho danh sách ['a', 'b', 'c'], với giá trị bắt đầu 10 và bước -2, sẽ tạo trình lặp số [(10, 'a'), (8, 'b'), (6, 'c')].

Trả lời

8

tôi đã không tìm thấy thêm thanh lịch, thành ngữ, và cách súc tích, hơn là viết một máy phát điện đơn giản:

def enumerate2(xs, start=0, step=1): 
    for x in xs: 
     yield (start, x) 
     start += step 

Ví dụ:

>>> list(enumerate2([1,2,3], 5, -1)) 
[(5, 1), (4, 2), (3, 3)] 
>>> list(enumerate2([1,2,3], 5, -2)) 
[(5, 1), (3, 2), (1, 3)] 

Nếu bạn không hiểu đoạn mã trên , đọc What does the "yield" keyword do in Python?Difference between Python's Generators and Iterators.

+0

Một thực hiện đúng. – pylang

+0

Đây là chức năng sử dụng tiêu chuẩn của tôi cho việc liệt kê từ giờ trở đi. – Steampunkery

3

Một lựa chọn là để zip bạn iterable đến một range:

for index, item in zip(range(10, 0, -2), ['a', 'b', 'c']): 
    ... 

này không có giới hạn mà bạn cần phải biết làm thế nào đến nay range nên đi (tối thiểu nó nên bao gồm - như trong ví dụ của tôi, số dư sẽ bị cắt bớt bởi zip).

Nếu bạn không biết, bạn có thể cuộn của riêng bạn "vô hạn range" và sử dụng rằng:

>>> def inf_range(start, step): 
    """Generator function to provide a never-ending range.""" 
    while True: 
     yield start 
     start += step 


>>> list(zip(inf_range(10, -2), ['a', 'b', 'c'])) 
[(10, 'a'), (8, 'b'), (6, 'c')] 
0

Một lựa chọn khác là sử dụng itertools.count, đó là hữu ích cho "liệt kê" bởi một bước , trong đảo ngược.

import itertools 

counter = itertools.count(10, -2) 
[(next(counter), letter) for letter in ["a", "b", "c"]] 
# [(10, 'a'), (8, 'b'), (6, 'c')] 

Đặc

  • súc tích
  • bước và logic hướng được gọn lưu trữ trong count()
  • chỉ số liệt kê được lặp với next()
  • count() vốn đã vô hạn; hữu ích nếu ranh giới thiết bị đầu cuối không rõ (xem @jonrsharpe)
  • chiều dài chuỗi chất chấm dứt lặp vô hạn
Các vấn đề liên quan