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
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.
Π değerini almak için en hızlı yolu ne...
Şu anda Simgelerini destekleyen tüm ta...
XmlDocument Satır sonları girintili XM...
Bir sayının tüm bölenlerine almak için...
Bir nesneyi klonlamak için en etkili y...