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