2013-01-09 26 views
15

私は美しいスープをPythonで使用して、HTMLファイルからデータを取ります。場合によっては、Beautiful SoupはstringNoneTypeの両方のオブジェクトを含むリストを返します。私はすべてのNoneTypeオブジェクトを除外したいと思います。リストからNoneType要素を削除するネイティブPython関数?

Pythonでは、NoneTypeオブジェクトを含むリストは反復可能ではないため、リスト内包はオプションではありません。具体的には、リストlisNoneTypesが含まれていて、[x for x in lis (some condition/function)]のようなものを実行しようとすると、PythonはエラーTypeError: argument of type 'NoneType' is not iterableを投げます。

other postsで見てきたように、この機能をユーザー定義関数に実装するのは簡単です。ここに私の風味があります:

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

しかし、私はそれが存在する場合は、内蔵のPython関数を使用したいと思います。私は常に可能な限り私のコードを簡素化したい。 リストからNoneType個のオブジェクトを削除できる組み込み関数はありますか?あなたも、それは本質的に同じバイトコードにコンパイルされた場合でも、is notを使用することができますコメントで指摘したように

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

:あなたは、この使用してリストの内包を行うことができます

+0

「なし」を含むリストは反復できません。間違っています。あなたはおそらく(偶然に) 'None'自身を反復しようとしています:' [x for None in] '。 –

答えて

39

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

これは間違っています。 '0'、' False'、 '' ''要素を削除します。 – thomaspaulb

+12

十分に良い。 'filter(lambda x:x!= None、lis)'を使うことができます。 – Abs

18

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

あなたは可能性がありも使用されます(注:これは空文字列をフィルタリングします。フィルタリングするものを詳細に制御する場合は、Noneの代わりに関数を渡すことができます):

clean = filter(None, lis) 

より効率的なループが必要な場合は、常にitertoolsというアプローチがありますが、これらの基本的なアプローチはほとんどの日常的なケースで有効です。

+1

PEP 8のように、シングルトンと比較するときは、 '!='ではなく 'is not'を使うべきです。 – Tim

+0

filter()は最初の引数として関数をとります。 –

+1

@ThorstenKranz最初のパラメータが 'None'の場合、すべての' False'のようなエントリ( 'None'、空の文字列、ゼロなど)をフィルタリングします。 – bereal

1

あなたは簡単にリストの内包表記を使用して、リストからすべてのNoneTypeオブジェクトを削除できます。

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

リスト内包表記を、他の回答は、完全を期すために、提案されているかのように:

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

をした場合リストが巨大な場合は、イテレータアプローチが優れています。

from itertools import ifilter 
clean = ifilter(lambda x: x is not None, lis) 
関連する問題