SORU
2 Mart 2010, Salı


Bir iterable ilk öğenin durumu eşleşen almak için en iyi yolu nedir?

Python, liste bir durum eşleşen ilk öğeyi almak istiyorum. Örneğin, aşağıdaki işlevi yeterli

def first(the_iterable, condition = lambda x: True):
    for i in the_iterable:
        if condition(i):
            return i

Bu fonksiyon şöyle bir şey olabilir:

>>> first(range(10))
0
>>> first(range(10), lambda i: i > 3)
4

Ancak, ben düşünemiyorum iyi bir dahili / oyunu için bana izin ver (ve ben özellikle istiyorum kopyalamak için bu işlevi çevresinde ise gerek yok). Herhangi bir fikir?

(Elde edilen yöntem oldukça büyük olabilir tüm liste, süreç önemlidir.)

CEVAP
2 Mart 2010, Salı


Python 2.6 veya daha iyi:

  • next(x for x in the_iterable if x > 3)

    eğer StopIteration Eğer eşleşen bir öğe bulunursa kabarık olmasını istiyorsanız,

  • next( (x for x in the_iterable if x>3), default_value)

    default_value (*8 örneğin*) yerine iade etmek istiyorsanız.
    Bu durumda jeneratör ifadesinin parantez içine fazladan bir çift gerekir - her zaman jeneratör ifadesi tek argüman değil ne zaman gerekli olduğunu unutmayın.

Gördüğüm en kararlı cevaplar Yoksay next built-in ve sanırım bunun için bazı gizemli nedenle onlar 100% odaklanmış sürüm 2.5 ve daha büyük olmadan söz Python-sürüm sorunu (ama ben görmüyorum söz-sorularyapınbunun cevabını kendime en az ... ... sağlamak için gerekli sanıyordum ediliyor next dahili, söz "" sorun, kayıtlara bu şekilde olur; -) doğru sürümü.

2.5, kullanımına .next() yöntemi yineleyici eğer iterable hiçbir öğe karşılamazsa hemen kullanmanız durumunda yani, bu, biterse hemen StopIteration yükseltir durumda. Umurunda değil (yani, biliyorsungerekiren azından tatmin edici bir madde olabilir) o zaman sadece .next() (next yerleşik Python 2.6 için genexp, bir çizgi en iyi, en iyi) kullanın.

Eğeryapınbakım, sarma işleri bir fonksiyonu olarak ilk gösterilen Q senin gibi iyi ve işlevi uygulama öneri güzel olabilir alternatif olarak kullanın itertools for...: break döngü, ya da bir genexp, veya try/except StopIteration işlevi vücudu, çeşitli yanıtlar önerdi. İlk önerilen duru-basit sürümü için gitmek istiyorum o kadar bu alternatiflerin herhangi bir katma değeri yok.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LIVESTRONG.COM

    LIVESTRONG.C

    5 EKİM 2005
  • steven johns

    steven johns

    11 Mart 2011
  • TechRax

    TechRax

    21 EYLÜL 2009