0

我有一个输入字典,我想将键与另一个字典进行比较,如果查找字典中的键被命中,我希望它运行一个函数作为查找字典中的值。

查找字典中的函数将返回一个需要“更新”到新字典中的键值对。所以这里有一个例子:

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 成为键和 va 值。请注意,dict 是从在表达式中运行的函数返回的。

4

2 回答 2

1

字典理解需要单独的keyvalue表达式:

{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()对象是一个字典视图它本身充当一个集合

out = dict(getattr(self, self.LOOKUPDICT[k])({k: query[k]})
           for k in query.keys() - self.exclusions)

其中query.keys() - self.exclusions表达式生成一组键,这些键在可迭代对象中query但不在可迭代对象 (set、dict、list、tuple 等)self.exclusions中。

如果self.LOOKUPDICT值映射到 上的属性self,则直接访问实例字典可能很有用:

attrs = vars(self)
out = dict(attrs[self.LOOKUPDICT[k]]({k: query[k]})
           for k in query.keys() - self.exclusions)
于 2015-06-23T21:06:22.997 回答
0

这个怎么样

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()}

第二个更好,因为它不会getattr(self,self.LOOKUPDICT[k])({k:query[k]})调用exclusions

于 2015-06-23T21:04:41.387 回答