1

私は、辞書の複数のアドホックコピーを作成して、わずかな世代の逸脱を伴ういくつかの「進化的状態」を保持する方法を探していましたが、この小さなプロトタイプ-dictを見つけました。

class ptdict(dict):
    def asprototype(self, arg=None, **kwargs):
        clone = self.__class__(self.copy())
        if isinstance(arg, (dict, ptdict)):
            clone.update(arg)
        clone.update(self.__class__(kwargs))        
        return clone

基本的に私はsmthが欲しいです。お気に入り:

generation0 = dict(propertyA="X", propertyB="Y")
generations = [generation0]

while not endofevolution():
    # prev. generation = template for next generation:
    nextgen = generations[-1].mutate(propertyB="Z", propertyC="NEW")  
    generations.append(nextgen)

等々。

このクラスの作者と私が何かを見逃しているのではないかと思っていました。想像できないので、これには標準ライブラリのアプローチがないのです。しかし、コレクションもitertoolsも、同様の単純なアプローチを提供していないようです。

itertools.teeでこのようなことを達成できますか?

更新:コピーと更新の問題ではありません。これは、まさにこのptdictが行っていることだからです。ただし、updateを使用しても、ptdictのようにdictが返されないため、たとえば、結果をチェーンしたり、インプレーステストを実行したりできます。これにより、読みやすさが大幅に向上します。(私が提供した例は少し些細なことかもしれませんが、大きな行列と混同したくありませんでした。)

十分に正確でなかったことをお詫びします。たぶん、次の例は、私が単一のコピー/更新ステップで辞書を取得することに興味がある理由を明らかにしています。

nextgen = nextgen.mutate(inject_mutagen("A")) if nextgen.mutate(inject_mutagen("A")).get("alive") else nextgen.mutate(inject_mutagen("C"))
4

3 に答える 3

7

私はあなたがこのようなものを探していると思います:

first = {'x':1, 'y':100, 'foo':'bar'}
second = dict(first, x=2, y=200) # {'y': 200, 'x': 2, 'foo': 'bar'}

見るdict

于 2012-11-20T08:35:51.793 に答える
0

カスタムタイプなしですぐに実行できます。dict次の代わりに and を使用するだけです。

nextgen = generations[-1].mutate(propertyB="Z", propertyC="NEW")

次のようにします。

nextgen = generations[-1].copy()  # "clone" previous generation
nextgen.update(propertyB="Z", propertyC="NEW")  # update properties of this gen.

ネストされた辞書がなく、単純なコピーの代わりにディープコピーが必要ない場合は、これで十分です。

于 2012-11-20T08:34:21.857 に答える
0

copy モジュールには、浅いコピーと深いコピーの関数が含まれています。

于 2012-11-20T08:34:38.133 に答える