2014-06-18 19 views
8

Python'un enumerate işlevi, daha büyük sayılardan daha küçük sayılara (azalan düzen, azaltma, geri sayım) numaralandırma yapmak nasıl yapılır? Veya genel olarak, enumerate'da farklı adım artırma/azaltma nasıl kullanılır?Python aşağı doğru veya özel bir adımla numaralandırıyor

örneğin, bu tür bir fonksiyon için, yineleyici [(10, 'a'), (8, 'b'), (6, 'c')] üretecektir, başlangıç ​​değeri 10 ve aşama -2 ile ['a', 'b', 'c'] liste uygulanır.

cevap

8

Ben basit jeneratör yazmak için değil, daha zarif deyimsel ve özlü bir yol bulamadı: Yukarıdaki kodu anlamadıysanız

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

:

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

Örnekler What does the "yield" keyword do in Python? ve Difference between Python's Generators and Iterators'u okuyun.

+0

Uygun bir uygulama bulur bilinmiyorsa. – pylang

+0

Bu, bundan sonra numaralandırma için standart kullanım fonksiyonum. – Steampunkery

3

Seçeneklerden biri bir range için zip Şu Verilerinizi iterable şudur:

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

Bu range (o kapsamalıdır minimum gitmeli ne kadar bilmemiz gerekir sınırlama yoktur - benim örnekte olduğu gibi, fazlalık zip tarafından kesilecektir. Eğer bilmiyorsanız

, kendi "sonsuz range" yuvarlanıp kullanabileceği:

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

Başka bir seçenek adım tarafından "numaralandırma" için yararlıdır itertools.count kullanmaktır numaralı telefondan numaralı telefonu tersine çevirir.

import itertools 

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

  • adım ve yön mantık

    • kısa Özellikler kompakt count() depolanır
    • numaralandırılmış endeksleri next()
    • count() ile tekrarlanır doğal sonsuz edilir ; yararlı uç sınır (@jonrsharpe bakınız)
    • dizi uzunluğu içsel sonsuz yineleyici
  • İlgili konular