2

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

def fmapMaybe(f, v):
    if v is not None:
        f(v)
    else:
        None

更新:我正在寻找一种方法来处理值,如果它们与 不同None,否则保持None,语义与 my 完全一样fmapMaybe

在上面的代码中,f是一个任意的 1 参数函数,并且v是一个值,f如果它不同于None. v对什么或是没有进一步的限制f

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

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

有没有更短更简洁的方法?

正如 Don Stewart 评论的那样,这类似于Haskellfmap中的Maybe函子或Scala 中的mapover Option。(如果我们认为它f也可以返回None,它将类似于>>=Haskell 和flatMapScala 中的 monadic。)

4

2 回答 2

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]
于 2013-08-04T12:30:07.283 回答
0

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

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

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

于 2013-07-31T08:55:34.907 回答