2

我有一个元组列表:

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}
4

2 回答 2

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 评论的那样,这已经变得有点不清楚了,所以为了清楚起见,可能将其分成两行

func_l = ((x, func(y)) for x, y in l)
result = dict((key, value) for key, value in func_l if isinstance(value, int))
于 2013-05-30T17:01:03.117 回答
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}
于 2013-05-30T17:02:34.903 回答