2012-10-20 14 views

cevap

37

:

for x in (y for y in items if y > 10): 
    .... 

itertools.ifilter başka bir seçenektir - ve hatta verimlilik önemli olduğunda, örneğin tercih edilir. büyük bir veri kümesinde.

+4

Bu, hiçbir ara dizi üretilmediğinden bunu yapmak için doğru yoldur. Buna jeneratör ifadesi denir. IMO, sadece x için x için daha kısa yazamazsınız x> 10: 'olsa. –

+0

@MichaelAnderson: Evet, bu temiz olurdu.Bu sözdiziminin Guido tarafından reddedildiği söylense de, bir kanıt bulamadım. – georg

7

Böyle bir şey demek: - Yeni bir liste oluşturmak olmaz Generator ifadesini kullanabilirsiniz,

item_list = [item for item in items if item > 3] 

Ya da, daha sonra yield kullanarak her tekrarında sonraki elemanını döndüren bir jeneratör, döner yöntemi: - bir generator expression ile döngü birleştirebilirsiniz

for item in (item for item in items if item > 3): 
    # Do your task 
+0

@Downvoter'da belirtilen True öğelerini ayıklayın. Neden bir düşüş yok? Downvoter yorumu yapabilir mi? –

+0

Bu yanlış .. –

+0

@ J.F.Sebastian Ah özür dilerim, sonra "if" olmalıdır. –

2

Orada sorunuzu where gibi özel bir sözdizimi değil, ama başka bir dilde yazar gibi her zaman sadece senin for döngü içinde if ifadeyi kullanabilirsiniz:

for item in items: 
    if item > 3: 
     # Your logic here 

ya da bir bekçi (başka bir dil gibi yine) fıkra: Bu sıkıcı yaklaşımların

for item in items: 
    if not (item > 3): continue 

    # Your logic here 

Hem bunun için özel bir sözdizimi olacaktır neredeyse özlü ve okunabilir.

+0

Bir jeneratör ifadesi ile en çok kullanılan çözüm daha işlevseldir ve listenin ifade için tam olarak ne içerdiğini gösterir. – Neil

+0

@Neil Bunun bir indirgeme garantisi olduğunu düşünmüyorum. "Daha işlevsel" iyi bir şey olup olmadığı bir tat sorusu. Bu yaklaşım, bazı durumlarda ayrıntılı görünen bir kod satırı kullanır; tek-çizgi jeneratörü, başlangıç ​​sekansı için ekspresyonu ve bir sentezleme ekspresyonunu bir sıraya (ve ek olarak bir 'x in' ekine) sokar ve bu da sekans ekspresyonu ve sentezleme ifadesi buysa bir satıra çok fazla tıklamaya çalışabilir. uzun. Jeneratör yaklaşımı, yeni dillerin aşina olabileceği bir dil özelliği de kullanır. En iyisi, bağlama ve izleyiciye bağlıdır. –

2

Sen açık if ifadeyi kullanabilirsiniz: Daha sonra yineleme bir isim gerekirse bir jeneratör oluşturabilir

for item in items: 
    if item > 3: 
     # ... 

Veya, example:

filtered_items = (n for n in items if n > 3) 

Yoksa bunu geçebileceği işlev:

total = sum(n for n in items if n > 3) 

Tadı sorun olabilir ama ben f Yukarıdaki seçeneklere göre çirkin olması için for x in (y for y in items if y > 3): gibi inline genexpr ile birleştirilen bir for-döngüsü belirtin.

0

Python 3 ve Python 2.7 her ikisi de bir işlev için (aşağıdaki örnekte, bu lambda fonksiyonudur) bir listeden ürün ekstre sağlar filter() fonksiyonu True döner sahiptir: filter() içinde

>>> nums=[1,2,3,4,5,6,7,8] 
>>> for item in filter(lambda x: x>5,nums): 
...  print(item) 
... 
6 
7 
8 

fonksiyonu atlama olacak Yalnızca pydoc filter