Python字典理解

时间:2015-06-23 20:58:57

标签: python-3.x dictionary dictionary-comprehension

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

查找字典中的函数将返回一个键值对,需要更新"更新"进入一个新的词典。所以这是一个例子:

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作为键并输入值。请注意,dict是从表达式中运行的函数返回的。

2 个答案:

答案 0 :(得分: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上进行迭代就足以产生密钥。你可以在这里使用set intersection; 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但不在可迭代中(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)

答案 1 :(得分: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调用