Dict理解,元组和懒惰的评价

时间:2014-01-03 17:58:20

标签: python python-3.x dictionary functional-programming

我试图看看我是否可以在Python中使用 lazy

我有一个字典理解,其中值是一个元组。我希望能够通过使用元组的第一个条目来创建元组的第二个条目。

一个例子应该有所帮助。

dictA = {'a': 1, 'b': 3, 'c': 42}
{key: (a = someComplexFunction(value), moreComplexFunction(a)) for key, value in dictA.items()}

moreComplexFunction是否有可能在元组的第一个条目中使用计算?

3 个答案:

答案 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}