1

私はおそらく正しく尋ねませんでした:どのリストにも一致できるリスト値が欲しいです:の「逆」です(None,) が、それを使用しても(None,)アイテムはNoneとして一致します(これは望ましくありません)

ポイントは、次の機能を使用することです。[x for x in my_list if x[field] not in filter_list]

そして、次のようなテストを作成せずに、すべてをフィルター処理するか、何もフィルターしないようにしたいと思います if filter_list==(None,): return []if filter_list==('*',): return my_list

listPS:いくつかのエラー(識別子)または愚かなことにつながる質問を簡素化したかった[x for x in x];)


やあ、

Pythonでリスト内包表記を使用してフィルタリングを行う必要があります。

私がそのようなことをしたら:

[x for x in list if x in (None,)]

すべての値を削除します。これで問題ありません

しかし、私はすべてに一致するように同じものを持ちたいです

私は次のようなことができます:

[x for x in list if x not in (None,)]

しかし、それは残りの部分と均質ではありません

いくつか試してみましたが、たとえば(True,)一致のみ 1

フィルタリングする値は数値であることに注意してください(None,)

ありがとうルイ

4

7 に答える 7

5

__contains__何かがシーケンス内にあるかどうかをチェックする魔法のメソッドです。

class everything(object):
    def __contains__(self, _):
        return True           

for x in (1,2,3):
    print x in everything()
于 2010-01-07T15:07:46.737 に答える
4

より良い構文は次のとおりです。

[x for x in lst if x is None]
[x for x in lst if x is not None]
于 2010-01-07T11:16:17.073 に答える
3

どういう意味

何にでも合うように同じものを揃えたい

やるだけ

[x for x in list]

のすべてのアイテムlistが一致します。

于 2010-01-07T11:17:16.527 に答える
3

リストの代わりにフィルター オブジェクトを受け入れるようにプログラムを変更できます。

抽象基本フィルターには、matchesx * が一致する場合に true を返すメソッドがあります。

一般的なケースのフィルターはリスト引数で構築され、リストのメンバーシップでフィルター処理されます-matches関数はリストを検索しtrue、引数がリストにあった場合に戻ります。

また、フィルタ オブジェクトの 2 つの特別なサブクラス、none と all を持つこともできます。

trueこれらには、常に(all) またはfalse(none)を返す特別な一致関数があります。

于 2010-01-07T14:49:58.673 に答える
0

は必要ありませんif

[x for x in list]
于 2010-01-07T11:17:01.783 に答える
0

しかし、私はすべてに一致するように同じものを持ちたいです

すべてを一致させるには、if ステートメントは必要ありません

[x for x in list1]

またはあなたが本当にしたい場合

[x for x in list1 if x in [x]]
于 2010-01-07T11:19:00.207 に答える
0

修正された質問に答える: すべての可能な値に「一致する」リストは、実質的に無限の長さです。したがって、if テストなしでは、やりたいことを実行できません。引数は、リストか、「すべて」と「なし」の場合を表す 2 つの値のいずれかにすることをお勧めします。

FILTER_NONE = object() # or []
FILTER_ALL = object()

def filter_func(alist, filter_list):
    if filter_list is FILTER_ALL:
        return []
    elif filter_list is FILTER_NONE:
        return alist
        # or maybe alist[:] # copy the list
    return [x for x in alist if x not in filter_list]

filter_list が大きい場合、最後の行を次のように置き換えたいと思うかもしれません:

    filter_set = set(filter_list)
    return [x for x in alist if x not in filter_set]

または、気にしないでください。filter_list (filter_collection に名前が変更された) は、サポートするものであれば何でもよいことを文書化するだけで __contains__()、セットはリストよりも高速であることを読者に思い出させてください。

于 2010-01-07T14:41:29.487 に答える