1

我正在寻找一种方法来创建字典的多个临时副本以保存一些“进化状态”,只有轻微的代际偏差,并找到了这个小原型字典:

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 不会返回 dict,而 ptdict 会返回,因此我可以例如链接结果或进行就地测试,这将大大提高可读性。(我提供的示例可能有点微不足道,但我不想与大矩阵混淆。)

我为不够精确而道歉。也许下面的例子说明了为什么我有兴趣使用一个复制/更新步骤来获取字典:

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

您可以立即执行此操作,无需自定义类型。只需使用dictand 而不是:

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

复制模块包含浅复制和深复制的功能。

于 2012-11-20T08:34:38.133 回答