6

メソッドを実装するディクショナリクラスが必要ですintersection_update。精神的にdict.updateは、呼び出し元のインスタンスにすでに存在するキーのみに更新を制限します(実装例については以下を参照してください)。

しかし、車輪の再発明の回避の精神で、この追加機能を備えたマッピングクラスの実装(およびテストの作成など)を開始する前に、このようなものは多かれ少なかれ標準モジュールにすでに存在しますか?


明確にするために、intersection_update私が考えている方法は次のようなことをします:

def intersection_update(self, other):
    for k in self.viewkeys() & other.viewkeys():
        self[k] = other[k]

...実際の実装では、次のようないくつかの可能な最適化が試行される場合があります。

def intersection_update(self, other):
    x, y = (self, other) if len(self) < len(other) else (other, self)
    for k in x.iterkeys():
        if k in y:
            self[k] = other[k]

編集:この投稿の元のバージョンでは、「または、[クラスと]メソッドを実装する必要がない標準のPythonイディオムはありintersection_updateますか?」と書いていましたが、さらに考えてみると、すぐに削除しました。 Python言語の「コア」を十分に知っているので、そのようなイディオムが存在しないことを確信しているので、それは弱い答えへの誘いであることに気づきました。少なくとも、利点(一般性、読みやすさ、入力のしやすさ)に一致するイディオムはありません。専用メソッドの。

4

2 に答える 2

2

これは既存の更新関数で使用できる擬似コードですが、辞書を拡張したい場合は、コードの一部も有効です-しかし、それはどこでもdictのクラスを使用するという余分な頭痛の種を追加します。

In [1]: x = dict(name='abc', age=23)

In [2]: y = dict(name='xyz', notes='Note 123', section=None)

In [3]: #x.update(dict((k,y[k]) for k in y if k in x))

In [3]: x.update((k,v) for k,v in y.iteritems() if k in x)

In [4]: x
Out[4]: {'age': 23, 'name': 'xyz'}

編集:iteritemsメソッドを使用してkjoのコメントに従ってコードを更新しました

于 2012-09-27T15:14:45.247 に答える
1

これを試して:

def dict_intersection(d1, d2):
    return dict((key, d2[key] or d1[key]) for key in frozenset(d1) & frozenset(d2))

または、Pythonバージョン> = 2.7の場合:

def dict_intersection(d1, d2):
    return {key: d2[key] or d1[key] for key in d1.viewkeys() & d2.viewkeys()}
于 2012-09-27T15:21:22.733 に答える