我试图看看我是否可以在Python中使用 lazy 。
我有一个字典理解,其中值是一个元组。我希望能够通过使用元组的第一个条目来创建元组的第二个条目。
一个例子应该有所帮助。
dictA = {'a': 1, 'b': 3, 'c': 42}
{key: (a = someComplexFunction(value), moreComplexFunction(a)) for key, value in dictA.items()}
moreComplexFunction
是否有可能在元组的第一个条目中使用计算?
答案 0 :(得分:6)
您可以在单元素元组上添加第二个循环:
{key: (a, moreComplexFuntion(a)) for key, value in dictA.items()
for a in (someComplexFunction(value),)}
这使您可以访问值表达式中someComplexFunction(value)
的输出,但这相当丑陋。
就个人而言,我会在这种情况下转向常规循环:
dictB = {}
for key, value in dictA.items():
a = someComplexFunction(value)
dictB[key] = (a, moreComplexFunction(a))
并完成它。
答案 1 :(得分:2)
或者,您可以编写一个函数来返回元组:
def kv_tuple(a):
tmp = someComplexFunction(a)
return (a, moreComplexFunction(tmp))
{key:kv_tuple(value) for key, value in dictA.items()}
这也让你可以选择使用像namedtuple这样的东西来获取元组项目的名称等等。我不知道这会有多快/多慢...虽然常规循环可能更快(更少的函数调用)...
答案 2 :(得分:1)
除了Martijn's answer之外,使用生成器表达式和字典理解也是非常语义和懒惰的:
dictA = { ... } # Your original dict
partially_computed = ((key, someComplexFunction(value))
for key, value in dictA.items())
dictB = {key: (a, moreComplexFunction(a)) for key, a in partially_computed}