32

Python で Beautiful Soup を使用して、HTML ファイルからデータをスクレイピングしています。場合によっては、Beautiful Soup はstringNoneTypeオブジェクトの両方を含むリストを返します。NoneTypeすべてのオブジェクトを除外したいと思います。

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

他の投稿で見たように、この機能をユーザー定義関数に実装するのは簡単です。これが私の味です:

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

However, I'd love to use a built-in Python function for this if it exists. I always like to simplify my code when possible. Does Python have a built-in function that can remove NoneType objects from lists?

4

5 に答える 5

65

これを行う最もクリーンな方法は次のようになると思います。

#lis = some list with NoneType's
filter(None, lis)
于 2013-01-09T07:40:54.533 に答える
25

リスト内包表記を使用してこれを行うことができます。

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

コメントで指摘されているようis notに、本質的に同じバイトコードにコンパイルされる場合でも、を使用することもできます。

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

使用することもできますfilter(注: これにより、空の文字列もフィルター処理されます。フィルター対象をより詳細に制御したい場合は、代わりに関数を渡すことができますNone):

clean = filter(None, lis)

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

于 2013-01-09T06:28:30.973 に答える
7

他の回答が提案したように、または完全を期すために、理解をリストします。

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

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

from itertools import ifilter
clean = ifilter(lambda x: x is not None, lis)
于 2013-01-09T06:31:11.337 に答える
2

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

lis = [i for i in lis if i is not None]
于 2013-01-09T06:28:37.280 に答える