将函数映射到tup中的元素

2024-05-14 11:08:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我会在哈斯凯尔这样做:

f :: Int -> (Int, Int)
-- for example:
f = `divMod` 12
foo :: [Int] -> (Int, Int)
foo = map (fmap (+1) . f)
-- foo [10, 11, 12, 13] = [(0,11),(0,12),(1,1),(1,2)]

有没有可能在Python中优雅地(不看内部f)完成这样的映射到元组吗我能做的最好的就是:

^{pr2}$

另一种可能是

def foo(lst):
  return map(lambda x: (f(x)[0], f(x)[1]+1), lst)

但这两种方法我都不喜欢。我不喜欢第一个表达式,因为它不是一个单独的表达式,不能很容易地内联。另一个解决方案有这个属性,但是它很难看,因为它在每次迭代中不必要地调用f()两次。有没有可能在迭代中以某种方式解包结果?在


Tags: lambdamapforreturnfoo表达式exampledef
2条回答

只需先将lst映射到f

try:
    # Python 2, forward compatible version of map
    from future_builtins import map
except ImportError:
    # Python 3, map is already an iterator
    pass

def foo(lst):
    return [(fxa, fxb + 1) for fxa, fxb in map(f, lst)]
    # or a generator expression for lazy evaluation
    # return ((fxa, fxb + 1) for fxa, fxb in map(f, lst)) 

好吧,我找到了一个解决方案,它具有两个所需的属性,但它的可读性不强:

def foo(lst):
  return map(lambda a, b: (a, b+1), *zip(*map(f, lst)))

相关问题 更多 >

    热门问题