我有一个元组列表:
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}
答案 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}