2013-01-09 18 views
15

HTML dosyalarından bazı verileri kopyalamak için Python'daki Güzel Çorba'yı kullanıyorum. Bazı durumlarda, Güzel Çorba, hem string hem de NoneType nesnelerini içeren listeleri döndürür. Tüm NoneType nesnelerini filtrelemek istiyorum.Yerel Python işlevi, NoneType öğelerini listeden kaldırmak için işlev mi?

Python'da, NoneType nesnelerini içeren listeler yinelenemez, bu nedenle liste anlama bunun için bir seçenek değildir. Spesifik olarak, NoneTypes içeren bir lis listemiz varsa ve [x for x in lis (some condition/function)] gibi bir şey yapmaya çalışıyorum, Python TypeError: argument of type 'NoneType' is not iterable hatasını atar.

other posts numaralı belgede gördüğümüz gibi, bu işlevi kullanıcı tanımlı bir işlevde uygulamak basittir.

def filterNoneType(lis): 
    lis2 = [] 
    for l in links: #filter out NoneType 
     if type(l) == str: 
      lis2.append(l) 
    return lis2 

Ancak, ben bir varolduğundan yerleşik Python fonksiyonu bunun için eğer kullanmak isteriz: Burada kendi üstüme lezzettir. Mümkün olduğunda kodumu her zaman basitleştirmeyi severim. Python, listelerindeki NoneType nesnelerini kaldırabilen yerleşik bir işlev var mı?

+0

'None'ı içeren listelerin yinelenen olmaması yanlıştır. Muhtemelen (yanlışlıkla) 'Hiçbiri'nin kendisi üzerinde yinelemeye çalışıyorsunuzdur:' [x'de Yok için x '). –

cevap

39

Bunu yapmanın en temiz yolu:

#lis = some list with NoneType's 
filter(None, lis) 
+21

profiline girerseniz biraz daha hızlıdır. '0',' False' ve ''' 'elementlerini kaldırın. – thomaspaulb

+12

Yeterince adil. Sonra süzgeci (lambda x: x! = Yok, lis) kullanabilirsiniz. – Abs

18

Bu kullanarak liste anlama yapabilirsiniz:

clean = [x for x in lis if x is not None] 

Yapabilirsin: Açıklamalarda belirttiği gibi sen de aslında aynı bayt kodu derler bile is not kullanabilirsiniz

clean = [x for x in lis if x != None] 

Ayrıca filter kullanıldı (not: bu, aynı zamanda boş dizeleri de filtreleyecek, ne filtre üzerinde daha fazla kontrol istiyorsanız, None yerine bir işlevi iletebilirsiniz):

clean = filter(None, lis) 

Daha verimli bir döngü istiyorsanız, her zaman itertools yaklaşımı vardır, ancak bu temel yaklaşımlar, günlük olayların çoğu için çalışmalıdır.

+1

PEP 8'e göre, single'larla karşılaştırırken '' yerine '' yerine 'kullanmalısınız. – Tim

+0

filter() ilk parametre –

+1

@ThorstenKranz işlevi olarak işlev görür; ilk param "None" ise "False" benzeri girişleri filtreler ("Yok", boş dizgiler, sıfırlar vb.). – bereal

1

Kolayca bir liste anlama kullanarak bir listeden tüm NoneType nesneleri kaldırmak olabilir:

clean = filter(lambda x: x is not None, lis) 

ise: tamlığı uğruna, diğer cevaplar önerdiği gibi,

lis = [i for i in lis if i is not None] 
4

Liste anlama veya liste büyüktür, yineleyici bir yaklaşım üstündür:

from itertools import ifilter 
clean = ifilter(lambda x: x is not None, lis) 
İlgili konular