2011-12-28 8 views
4

私は辞書オブジェクトを持っていて、特定の条件に一致する親辞書のすべての要素を含む辞書のサブセットを抽出したい(つまり別の辞書を返す)。例えば辞書のすべての要素を2つのキーの間に置くPythonの方法?

parent_dict = {1: 'Homer', 
       2: 'Bart', 
       3: 'Lisa', 
       4: 'Marge', 
       5: 'Maggie' 
       } 


def filter_func(somedict, key_criteria_func): 
    pass 
私はこのようにそれを呼び出すことができるように、(ニシキヘビの方法で) filter_funcを書きたい

filter_func(parent_dict, ">2 and <4") 

新しい辞書を返すなります。 filter_func?を書くための最も神託の方法です何

{ 3: 'Lisa' } 

単純なものを維持するために、条件を単純なブール演算に限定します。

[[編集]]

私は、次のコマンドを実行しようとすると、これが出力されます。

>>> {key:val for key,val in parent_dict.iteritems() if 2 < key < 4 } 
    File "<stdin>", line 1 
    {key:val for key,val in parent_dict.iteritems() if 2 < key < 4 } 
      ^
SyntaxError: invalid syntax 

はところで、私は、Python 2.5用のPython 2.6.5

+0

ラムダについて少し説明を追加しました。楽しい。 –

答えて

3
dict((k,v) for k,v in parent_dict.iteritems() if 2 < k < 4) 

これはPython 2.6.5で動作します。

1

を実行していますよ.2:

dict((k,v) for k,v in parent_dict.iteritems() if k > 2 and k < 4) 
4

のpython 2.7から出発溶液

、あなたは辞書内包表記を使用することができます。そこリスト内包に似ていますが、辞書に適用される:

>>> parent_dict = {1: 'Homer', 
...    2: 'Bart', 
...    3: 'Lisa', 
...    4: 'Marge', 
...    5: 'Maggie' 
...    } 
>>> {key:val for key,val in parent_dict.iteritems() if 2 < key < 4 } 
1: {3: 'Lisa'} 

あなたはおそらくそれ機能する必要はありませんが、あなたがしなければ、あなただけのフィルタとしてラムダ関数を使用することができます。

Pythonの2.6.5と2.7より前のすべてのバージョンについては
>>> def filter_func(somedict, key_criteria_func): 
...  return {k:v for k, v in somedict.iteritems() if key_criteria_func(k)} 
... 
... filter_func(parent_dict, lambda x: 2 < x < 4) 
2: {3: 'Lisa'} 

、とdictの理解を置き換える:

dict((k,v) for k,v in parent_dict.iteritems() if 2 < k < 4) 

なぜラムダ関数?

ラムダ関数は魔法ではなく、簡単にその場で作成することができます。あなたはlambdaといっしょにすることができますが、唯一の違いはラムダが式であり、そのために親の間で直接使用できることです。

>>> def func(x): 
... return 2 < x < 4 
... 
>>> func(3) 
True 

それはまったく同じだと名前を持っていませんラムダ関数を除いて、同じ機能を生成:

>>> func = lambda x: 2 < x < 4 
>>> func(3) 
True 

で:

を比較してください。しかし、あなたは気にしません。あなたは名前が必要ではありません。それを呼び出すための参照が必要です。変数funcにこの参照が含まれています。あなたはdef var(param):が、var = lambda param:をしない

  • (あなたも、パラメータを必要としない)のパラメータの括弧は必要ありません

    • :ので

      ラムダ構文は奇妙です。何も魔法は、それは構文だけです

    • あなたは2行を作ることができませんlambda:戻り結果は1つの命令に収まる必要があります。
    • あなたはreturnキーワードを使用していない:ラムダの右部分が自動的に

    返される今、ラムダとの良いところは、それは表現なので、あなたは意味、Parentheseの間でそれを使用することができるということです同じ時間にあなたの作成し、渡すことができます。

    は比較:

    >>> filter_func(parent_dict, lambda x: 2 < x < 4) 
    

    で:

    >>> def func(x): 
    ... return 2 < x < 4 
    ... 
    >>> filter_func(parent_dict, func) 
    

    それはまったく同じです。ラムダはちょうど短いです。

    難しい部分は、Pythonのすべての関数が関数を含むオブジェクトであるため、関数をPythonのパラメータとして渡すことができることを理解することです。

    >>> def func(): 
    ... print "test" 
    ... 
    >>> ref_to_func = funC# assign the function refence to another var 
    >>> del funC# delete this label 
    >>> ref_to_func() # call the function from this label 
    test 
    

    をあなたも1行にfonctionを定義することができます:

    あなたも、これを行うことができます

    >>> def func(): print "test" 
    >>> func() 
    test 
    

    しかし、あなたはこれを行うことはできません。

    filter_func(parent_dict, def func(x): 2 < x 4) 
    

    をラムダが役に立つ場所です。

  • +0

    私はそれが何とかラムダ関数を含むことを知っていました。私はその時間を彼らを助けるのを止めて、それらについて読んでみるべきだと思う。あなたはlambad関数の簡単な紹介へのリンクを投稿することができますか? –

    +0

    スニペットに問題があるようです。私の編集した質問を見てください。 –

    +0

    @HomunculusReticulli - @ e-satis 'バージョンは、Python 2.6.5では動作しません。 '{k:v ...}の代わりに' dict((k、v)...) 'を使う必要があります。 – eumiro

    関連する問題