我编写了一个创建字典映射字符串的函数 - >发电机表达。生成器表达式根据两个条件过滤项目列表,这两个条件对于字典中的每个生成器都是不同的。
def iters(types):
iterators = {}
for tname in types:
inst, type = tname.split('|')
iterators[tname] = (t for t in transactions() if t['institution_type'] == inst and t['type'] == type)
return iterators
我遇到的问题是所有的生成器都是根据inst
和type
的最后一个值进行过滤的,大概是因为这两个变量在每次迭代中被重复使用循环。我怎样才能解决这个问题?
答案 0 :(得分:4)
是的,inst
和type
名称用作闭包;当你迭代生成器时,它们被绑定到循环中的最后一个值。
为名称创建新范围;一个函数可以做到这一点:
def iters(types):
def build_gen(tname):
inst, type = tname.split('|')
return (t for t in transactions()
if t['institution_type'] == inst and t['type'] == type)
iterators = {}
for tname in types:
iterators[tname] = build_gen(tname)
return iterators
你也可以用dict理解来替换最后一行:
def iters(types):
def build_gen(tname):
inst, type = tname.split('|')
return (t for t in transactions()
if t['institution_type'] == inst and t['type'] == type)
return {tname: build_gen(tname) for tname in types}