将字典理解自分配给字典中的 class
self-assign a dict-comprehension to a class from dict
我正在从字典对象
创建子对象class
class FeatureVector(dict):
def __init__(self, init_val=0):
super().__init__()
self.init_val = init_val
在这个 class 中,我尝试使用字典理解自行分配一个函数,就像这个简化的例子:
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
我仍然可以想象 'self-assigning' 字典到 dict-child class 的情况可能会更有效,以防字典已经可用,或者当我想初始化类似 dict 的时候- 带有字典的对象。
在那种情况下,我可以这样做:
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
不过这并没有真正让人感觉优雅和良心。有没有更好的单行/不那么冗长的方式?
你试过吗?
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
方法添加提供给自己的字典。
我正在从字典对象
创建子对象classclass FeatureVector(dict):
def __init__(self, init_val=0):
super().__init__()
self.init_val = init_val
在这个 class 中,我尝试使用字典理解自行分配一个函数,就像这个简化的例子:
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
我仍然可以想象 'self-assigning' 字典到 dict-child class 的情况可能会更有效,以防字典已经可用,或者当我想初始化类似 dict 的时候- 带有字典的对象。
在那种情况下,我可以这样做:
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
不过这并没有真正让人感觉优雅和良心。有没有更好的单行/不那么冗长的方式?
你试过吗?
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
方法添加提供给自己的字典。