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

  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • New Scientist

    New Scientis

    27 Kasım 2006
  • Tianna Sierra Dance

    Tianna Sierr

    16 EYLÜL 2013