2016-10-31 4 views
1

私は順序付けられた辞書を持っています、そして、そのキー/値のペアの山があります。私はitems()メソッドでそれらをすべて抽出できます。しかし、私はそれらのうちのいくつかを選択したい場合はどうすればいいですか?ordereddictのサブセットフィールド?

>>> import collections 
>>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2}) 
>>> d.items() 
[('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)] 

リンゴとバナナがほしいのですが?

私は欲しいキーを指定する方法はありますか?

>>> d['apple','banana'] <-- does not work 

私は結果をフィルタリングするために最後にリストの内包表記を使用して検討したが、厄介なようで、私はより良い方法があると思いました。

+0

「リンゴ」、「バナナ」」を生産するにはどうしますか? – martineau

+0

.items()と同じタプルまたはキーと値のペアのリストです。 – Exie

答えて

0

あなたはおそらく、リストの理解を一方的に使い切ってしまいます。ここではメソッドの実装ではリストの内包を埋めるための方法です:そのクラス定義と

from collections import OrderedDict 

class MultOrderedDict(OrderedDict): 
    def items(self, *items): 
     all = super(MultOrderedDict, self).items() 
     if not items: 
      return all 
     return type(self)((key, value) for (key, value) in all if key in items).items() 

あなたはこのような何かを行うことができます(それはmultorddict.pyにだと仮定します):

>>> from multorddict import MultOrderedDict 
>>> mod = MultOrderedDict(banana=3, apple=4, pear=1, orange=2) 
>>> mod.items() 
[('orange', 2), ('pear', 1), ('apple', 4), ('banana', 3)] 
>>> mod.items('apple','banana') 
[('apple', 4), ('banana', 3)] 
>>> 

このアプローチは、セマンティクスを変更しますitemsメソッドの、これはあまり良いことではないかもしれません。

+0

これは、 'items()'と同じように、タプルまたはキーと値のペアのリストを返しません。また、mod ['apple'、 'banana'] 'が実行されると、無限に再帰します。 – martineau

+0

合意した、私はPython2で私の最初の実装をテストしなかった(python3では同じ問題はない)。受け入れられなかったので答えを削除するだけですが、 '__getitem__'ではなく' items'をオーバーライドするように言い換えました。最終的には、リスト内包表記に慣れて、それらを直接使用する方が理にかなっています。 –

1

私は存在する方法についてはわかりませんが、これがコードベースを介して行う必要がある場合は、汎用メソッドを作成する間は価値があります。たぶん

>>> specific_dict_items = lambda d, l: [(key, d.get(key, '')) for key in l] 
>>> specific_dict_items({1:1, 2:2, 3:3, 4:4, 5:5}, [1, 3, 5, 7]) 
[(1, 1), (3, 3), (5, 5), (7, '')] 
3

のようなものは、あなたはそれを行うにはワンライナーを定義することができます。

>>> import collections 
>>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2}) 
>>> d.items() 
[('orange', 2), ('pear', 1), ('banana', 3), ('apple', 4)] 
>>> 
>>> subset = lambda d, *keys: [(key, d[key]) for key in keys] 
>>> subset(d, 'apple', 'banana') 
[('apple', 4), ('banana', 3)] 

、それはまた、定期的にdictオブジェクトで動作しますボーナスとして。

関連する問題