2 votes

Fonction d'affectation à un élément du tuple

J'ai en tête quelque chose que je ferais en Haskell comme ceci :

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)]

Est-il possible d'effectuer un tel mappage vers un tuple en Python de manière élégante (sans regarder à l'intérieur de l'application) ? f ?) Le mieux que j'ai pu trouver est :

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

une autre possibilité est

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

Mais je n'aime aucune des deux solutions. Je n'aime pas la première, parce que ce n'est pas une expression unique et qu'elle ne pourrait pas être aussi facilement inlined. L'autre solution a cette propriété, mais elle est moche car elle appelle inutilement f() deux fois à chaque itération. Est-il possible de décomposer le résultat à l'intérieur de l'itération ?

2voto

Martijn Pieters Points 271458

Juste une carte lst à f d'abord :

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))

0voto

user1747134 Points 1012

OK, j'ai donc trouvé une solution qui possède les deux propriétés souhaitées, mais elle n'est pas très lisible :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X