2012-02-18 15 views
5

から特定のキーと値のペアを含むPythonの辞書を作成し、私は次のようになりますいくつかのコードがあります。別の辞書

d = {'foo': True, 'bar': 42, 'baz': '!'} 

a = {'foo': d['foo'], 'bar': d['bar']} 
b = {'foo': d['foo'], 'baz': d['baz']} 
c = {'bar': d['bar'], 'baz': d['baz']} 

は確かにこれを表現するためのより良い方法がありますが。私は実際に辞書のcopy方法は、新しい辞書に含まれるキーを受け入れることを期待してドキュメントをお読みください。

# I'd hoped that something like this would work... 
a = d.copy('foo', 'bar') 
b = d.copy('foo', 'baz') 
c = d.copy('bar', 'baz') 

私は、この目的のために関数を書くことができます:

copydict = lambda dct, *keys: {key: dct[key] for key in keys} 

a = copydict(d, 'foo', 'bar') 
b = copydict(d, 'foo', 'baz') 
c = copydict(d, 'bar', 'baz') 

が良くあります上記よりもソリューションですか?

+0

なぜa、b、cのリスト(またはセット)を使用しないのですか?あなたが必要なときにdで価値を冷たく見てください。 – maxy

+0

私はDjangoの 'urlencode'関数(' urllib.urlencode'のように、辞書を受け入れる)に 'a'、' b'、 'c'を渡しています。 – davidchambers

+0

@BlaXpirit:あなたは "No"を含む答えを書くべきです。 (HTMLコメント付きの最小サイズまでのパッド)ので、私たちはすべて狂ってそれを投票することができます。 –

答えて

5

質問の機能が最適な解決策だと思います。

もちろん、誰かが慣用的なコードを投稿する可能性がありますが、私はそれがより速く/より速く動作しないと確信しています。リストを反復し、キーによる辞書からアイテムを取得することは、取得できるほど速くなります。

keysパラメータからスターを削除することをお勧めします。引数をアンパックすると、不要なオーバーヘッドが追加されます。これらのキーをタプルとして渡すだけで問題はありません。

>>> from operator import itemgetter 
>>> d = {'foo': True, 'bar': 42, 'baz': '!'} 
>>> keys = ['foo', 'bar'] 
>>> dict(zip(keys, itemgetter(*keys)(d))) 
{'bar': 42, 'foo': True} 
0

としては、このソリューションは、おそらく速度や読みやすさの面であなたより良くするつもりはないが、あなたはこのような何かを行うことができ、@BlaXpiritによって指摘しました作るラムダではない、本当の関数定義を使用することです:

def copy_dict(d, *keys): 
    """Make a copy of only the `keys` from dictionary `d`.""" 
    return {key: d[key] for key in keys} 

行方不明のキーに対処するために有用である可能性がありますが、Pythonの2にあなたがきれいに*引数とオプションのキーワード引数を混在させることはできませんので、あなたは可能性があります引数をタプルにする必要があります:

def copy_dict(d, keys, default=None): 
    """Make a copy of only the `keys` from dictionary `d`. 

    Use `default` if a key is missing. 

    """ 
    return {key: d.get(key, default) for key in keys} 
3

私は希望だけ改善: