如果值与None不同,如何映射一个值?

时间:2013-07-31 08:45:10

标签: python functional-programming maybe

当且仅当它不是None时,是否有一种简洁的方法来映射值?像

这样的东西
def fmapMaybe(f, v):
    if v is not None:
        f(v)
    else:
        None

更新:我正在寻找一种如何处理价值观的方法,如果它们与None不同,则保留None,其语义与我的fmapMaybe

在上面的代码中,f是一个任意的1参数函数,v是一个值,如果它与f不同,则应该传递给None。对vf的内容没有进一步的限制。

举一个具体的例子:我想从字典中获取字符串值并将其转换为整数(如果找到)。所以结果应该是整数,或None。使用上面的函数,我写道:

fmapMaybe(int, os.environ.get('LINES'))

是否有更简洁,更简洁的方式?

正如唐·斯图尔特评论的那样,这与Haskell中的fmap仿函数相似Maybe,或者Scala中map而不是Option。 (如果我们认为f也可以返回None,则它类似于Haskell中的monadic >>=和Scala中的flatMap

2 个答案:

答案 0 :(得分:0)

如果你没有告诉我们v是什么以及你想做什么,这是我能想到的最好的。如果v是可迭代的:

result = [f(x) for x in v if x != None]

如果v是单个值,那么你的if条件对我来说听起来不错。

答案 1 :(得分:0)

与评论中已经说过的内容相似:

fmapMaybe = lambda f,list : map(f,(i for i in list if i!=None))

测试:

x = [1, 2, 3, None, 5, None, None, 8]
fmapMaybe( lambda x:x**2, x )
#[1, 4, 9, 25, 64]