Python 词典理解
Python dictionary comprehension
我有一个输入字典,我想将键与另一个字典进行比较,如果查找字典中的键被命中,我希望它 运行 一个函数作为查找字典中的值。
look up dict中的函数将return一个需要"updated"的键值对放入一个新的dict中。所以这是一个例子:
out = {getattr(self,self.LOOKUPDICT[k])({k:query[k]}) for k in query.keys() if k not in self.exclusions}
的结果
getattr(self,self.LOOKUPDICT[k])({k:query[k]})
字典是这样的:
{'new_key':'new_val'}
在理解中我得到
TypeError: unhashable type: 'dict'
因为它需要一个键值对。
现在我只能 运行 一个常规循环和一个 if 语句,但我对这些有点反感。这里有什么解决方法吗?
TLDR:
字典理解,如何插入这样的字典:
{{'k':'v'} for k in blahblah}
并使 k 成为键,v 成为值。请注意,dict 是 returned 来自在表达式中获取 运行 的函数。
这个怎么样
out = {_k:_v for k in query.keys() for _k,_v in
getattr(self,self.LOOKUPDICT[k])({k:query[k]}).items()
if k not in self.exclusions}
虽然这一个可能是您所追求的
out = {_k:_v for k in set(query.keys()).difference(self.exclusions)
for _k,_v in getattr(self,self.LOOKUPDICT[k])({k:query[k]}).items()}
第二个更好,因为它不会对 exclusions
进行 getattr(self,self.LOOKUPDICT[k])({k:query[k]})
调用
字典理解需要单独的 key
和 value
表达式:
{key_expr: value_expr for iterable [more if and for parts]}
但是如果你的函数同时产生两者,你最好使用带循环的 dict()
函数:
out = dict(getattr(self, self.LOOKUPDICT[k])({k: query[k]})
for k in query if k not in self.exclusions)
因为该函数采用一系列 元组 ,每个元组都包含一个键值对。
注意这里不需要调用.keys()
;直接在 query
上迭代就足以产生密钥。您可以在此处使用设置交叉点; dict.keys()
对象是一个 dictionary view, 本身作为一个集合:
out = dict(getattr(self, self.LOOKUPDICT[k])({k: query[k]})
for k in query.keys() - self.exclusions)
其中 query.keys() - self.exclusions
表达式生成一组键,这些键在 query
中但不在可迭代对象(集合、字典、列表、元组等)self.exclusions
中。
如果 self.LOOKUPDICT
值映射到 self
上的属性,直接访问实例字典可能很有用:
attrs = vars(self)
out = dict(attrs[self.LOOKUPDICT[k]]({k: query[k]})
for k in query.keys() - self.exclusions)
我有一个输入字典,我想将键与另一个字典进行比较,如果查找字典中的键被命中,我希望它 运行 一个函数作为查找字典中的值。
look up dict中的函数将return一个需要"updated"的键值对放入一个新的dict中。所以这是一个例子:
out = {getattr(self,self.LOOKUPDICT[k])({k:query[k]}) for k in query.keys() if k not in self.exclusions}
的结果
getattr(self,self.LOOKUPDICT[k])({k:query[k]})
字典是这样的:
{'new_key':'new_val'}
在理解中我得到
TypeError: unhashable type: 'dict'
因为它需要一个键值对。
现在我只能 运行 一个常规循环和一个 if 语句,但我对这些有点反感。这里有什么解决方法吗?
TLDR: 字典理解,如何插入这样的字典:
{{'k':'v'} for k in blahblah}
并使 k 成为键,v 成为值。请注意,dict 是 returned 来自在表达式中获取 运行 的函数。
这个怎么样
out = {_k:_v for k in query.keys() for _k,_v in
getattr(self,self.LOOKUPDICT[k])({k:query[k]}).items()
if k not in self.exclusions}
虽然这一个可能是您所追求的
out = {_k:_v for k in set(query.keys()).difference(self.exclusions)
for _k,_v in getattr(self,self.LOOKUPDICT[k])({k:query[k]}).items()}
第二个更好,因为它不会对 exclusions
getattr(self,self.LOOKUPDICT[k])({k:query[k]})
调用
字典理解需要单独的 key
和 value
表达式:
{key_expr: value_expr for iterable [more if and for parts]}
但是如果你的函数同时产生两者,你最好使用带循环的 dict()
函数:
out = dict(getattr(self, self.LOOKUPDICT[k])({k: query[k]})
for k in query if k not in self.exclusions)
因为该函数采用一系列 元组 ,每个元组都包含一个键值对。
注意这里不需要调用.keys()
;直接在 query
上迭代就足以产生密钥。您可以在此处使用设置交叉点; dict.keys()
对象是一个 dictionary view, 本身作为一个集合:
out = dict(getattr(self, self.LOOKUPDICT[k])({k: query[k]})
for k in query.keys() - self.exclusions)
其中 query.keys() - self.exclusions
表达式生成一组键,这些键在 query
中但不在可迭代对象(集合、字典、列表、元组等)self.exclusions
中。
如果 self.LOOKUPDICT
值映射到 self
上的属性,直接访问实例字典可能很有用:
attrs = vars(self)
out = dict(attrs[self.LOOKUPDICT[k]]({k: query[k]})
for k in query.keys() - self.exclusions)