从词典中自我分配一个词典理解

时间:2015-01-19 22:20:28

标签: python class dictionary dictionary-comprehension

我正在从dict对象创建子类

class FeatureVector(dict):

    def __init__(self, init_val=0):
        super().__init__()
        self.init_val = init_val

在这个课程中,我尝试自我分配一个字典理解的函数,就像这个简化的例子一样:

    def load_fv(self, fvlist):
        self = {k:float(val) for k, val in fvlist}

在此示例中,fvlist构建如下:

fvlist = [["example", 1], ["feature", 2], ["vector", 3], ["list", 4]]

这种load_fv方法不起作用。字典仍为空:{}

经过一些搜索,我发现这是因为self是不可变的,如下所述:Why is `self` in Python objects immutable?

所以也许我只是想做一些我不应该做的事情。当然,有可能创建一个使用for循环执行dict-comprehension的函数:

    def load_fv(self, fvlist):
        self.clear()
        for x, y in fvlist:
            self[x] = y 

我仍然能够想象出自我分配的情况'如果字典已经可用,或者我想用字典初始化类似dict的对象,那么dict-child类的字典可能会更有效。

在这种情况下,我可以做类似的事情:

    def __init__(self, init_dict, init_val=0):
        super().__init__()
        self.init_val = init_val
        self.load_fv(fvlist)

    def load_fv(self, fvlist):
        self.clear()
        if isinstance(fvlist, dict) or isinstance(fvlist, FeatureVector):
            fvlist = [[key, val] for key, val in fvdict.items()]
        for x, y in fvlist:
            self[x] = y 

这仍然没有真正优雅和善意。是否有更好的单线/更简洁的方式?

1 个答案:

答案 0 :(得分:2)

你试过这个吗?

def __init__(self, init_dict, init_val=0):
    super().__init__()
    self.init_val = init_val
    self.update(init_dict)
    # Here init_dict is a dictionary or a dictionary like object

update方法添加提供给自己的字典。