将函数映射到元组中的元素

时间:2017-04-06 08:22:12

标签: python haskell generator

我想到了我会在Haskell中做的事情:

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内部?)我能得到的最好的是:

def foo(lst):
  for x in lst:
    a, b = f(x)
    yield a, b + 1

另一种可能性是

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

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

2 个答案:

答案 0 :(得分: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)) 

答案 1 :(得分:0)

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

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