当且仅当它不是None
时,是否有一种简洁的方法来映射值?像
def fmapMaybe(f, v):
if v is not None:
f(v)
else:
None
更新:我正在寻找一种如何处理价值观的方法,如果它们与None
不同,则保留None
,其语义与我的fmapMaybe
。
在上面的代码中,f
是一个任意的1参数函数,v
是一个值,如果它与f
不同,则应该传递给None
。对v
或f
的内容没有进一步的限制。
举一个具体的例子:我想从字典中获取字符串值并将其转换为整数(如果找到)。所以结果应该是整数,或None
。使用上面的函数,我写道:
fmapMaybe(int, os.environ.get('LINES'))
是否有更简洁,更简洁的方式?
正如唐·斯图尔特评论的那样,这与Haskell中的fmap
仿函数相似Maybe
,或者Scala中map
而不是Option
。 (如果我们认为f
也可以返回None
,则它类似于Haskell中的monadic >>=
和Scala中的flatMap
。
答案 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]