理解能在这里吗?

时间:2013-05-30 17:00:02

标签: python

我有一个元组列表:

l=[('soccer',11),('tennis',2),('chess',2),('xanadu',None)]

假设我们定义了如下函数:

def func(x):
    if type(x) is int:
       return x*2
    else:
       return None

我需要将此函数应用于每个元组的元素[1],结果将以元素[0]作为键返回。

这可以作为列表'l'的理解吗? 只是为了让事情变得有趣 - 我只需要包含那些func(x)返回int的结果。

预期产出:

{'soccer':22,'tennis':4,'chess':4}

2 个答案:

答案 0 :(得分:7)

是的,使用元组扩展非常容易

dict([(x, func(y)) for x, y in l])

或立刻完成整个事情(2.7 +)

{x: func(y) for x, y in l if isinstance(func(y), int)}

如果func很贵并且你不想计算它两次你可以(但如果它像你的例子一样简单,我就不会打扰)

{key: value for key, value in ((x, func(y)) for x, y in l) if isinstance(value, int)}

或用于python 2.6.x

dict((key, value) for key, value in ((x, func(y)) for x, y in l) if isinstance(value, int))

作为Nisan.H评论这已经变得有点不清楚所以也许为了清晰度将它分成2行

func_l = ((x, func(y)) for x, y in l)
result = dict((key, value) for key, value in func_l if isinstance(value, int))

答案 1 :(得分:2)

>>> l=[('soccer',11),('tennis',2),('chess',2)]
>>> def func(x):
        return x*2
... 
>>> dict((a, func(b)) for a,b in l)
{'tennis': 4, 'soccer': 22, 'chess': 4}

使用dict理解:

>>> { a : func(b) for a,b in l}
{'tennis': 4, 'soccer': 22, 'chess': 4}

<强>更新

def func(x):
    return x*2

lis = [('soccer',11),('tennis',2),('chess',2),('xanadu',None)]

#do type checking here
print { a : func(b) for a,b in lis if isinstance(b, (int,float))}

#for py2.6 or earlier
print dict( (a, func(b)) for a,b in lis if isinstance(b, (int,float)))

<强>输出:

{'tennis': 4, 'soccer': 22, 'chess': 4}