SORU
27 EKİM 2009, Salı


Bir python son öğe tespit pythonic yol '' döngü nedir?

En iyi şekilde (daha kompakt ve "") for döngüsü içinde. son öğe için özel bir tedavi yapmak için bir pythonic bilmek istiyorum Çağrılmalıdır kodu bir parça vararasındaelemanları, son bastırılıyor.

Ben şu anda bunu yapmak nasıl:

for i, data in enumerate(data_list):
    code_that_is_done_for_every_element
    if i != len(data_list) - 1:
        code_that_is_done_between_elements

Daha iyi bir yolu var mı?

Not: kullanma reduce ;) gibi kesmek ile bunu yapmak istemiyorum

CEVAP
27 EKİM 2009, Salı


Bu yapmak kolaydır times (ve ucuz) çoğuilkyineleme özel durum yerine geçen

first = True
for data in data_list:
    if first:
        first = False
    else:
        between_items()

    item()

Bu bile len() si için herhangi bir iterable için çalışır:

file = open('/path/to/file')
for line in file:
    process_line(line)

    # No way of telling if this is the last line!

Bunun dışında, yapmaya çalıştığınız ne bağlı olarak genel olarak üstün bir çözüm olduğunu sanmıyorum. Eğer listeden bir dize oluşturuyorsanız, örneğin, doğal olarak daha iyi for bir döngü kullanarak daha str.join() kullanmak için “özel durum”.


Ama daha kompakt aynı prensibi kullanarak

for i, line in enumerate(data_list):
    if i > 0:
        between_items()
    item()

Tanıdık geliyor, değil mi? :)


@Ofko ve gerçekten varsa len() olmadan bir iterable geçerli değer son bulmak için gereken başkaları için, ileriye bakmak gerekir:

def lookahead(iterable):
    it = iter(iterable)
    last = it.next() # next(it) in Python 3
    for val in it:
        yield last, False
        last = val
    yield last, True

O zaman bu gibi kullanabilirsiniz:

>>> for i, last in lookahead(range(3)):
...     print i, last
0 False
1 False
2 True

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • GFX Tutorials

    GFX Tutorial

    12 AĞUSTOS 2013
  • iBand IguJoo

    iBand IguJoo

    25 AĞUSTOS 2006