我想到了我会在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()
两次。有可能以某种方式在迭代中解压缩结果吗?
答案 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)))