-2
votes

Évaluation adéquate de Lambdas dans une compréhension de la liste

Considérez une fonction Python:

<class 'list'>: [<function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5730>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5840>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee58c8>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5950>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee59d8>]


9 commentaires

Quel est le comportement attendu?


Cela devrait fonctionner sans fonction ni lambda [x.split (x.split ('') pour x dans tt]


Si vous pensez à cette compréhension ( pour chaque X en TT, renvoyez une nouvelle Lambda ... ) Il devrait avoir un sens à vous pourquoi vous voyez ce que vous voyez ...


@Dawg peut-être, mais je ne sais pas comment structurer cela pour obtenir le résultat de l'évaluation d'une lambda ou d'une fonction.


Donc, vous voulez appliquer plusieurs fonctions à une ierrable?


Comme c'est le cas, votre code ne fait rien d'utile, il est donc difficile pour nous de dire quelle est la meilleure façon de le faire. Comme c'est le cas, les valeurs dans tt sont complètement ignorées et que vous obtenez un tas de Lambdas qui font toutes la même chose. Que voulez-vous que le code fasse?


L'autonome lambda x: x.split ('') définit uniquement une fonction lambda; Il n'appelle pas la fonction Lambda. Utilisez mapper pour définir un appelable et l'appeler en une étape ou défini la fonction ou la Lambda à l'externe de la compréhension de la liste.


@Dawg YA THX - J'ai eu ça de la réponse acceptée


Il est étrange que x est utilisé à 2 fins différentes - Argument de Lambda et variable d'itération. Si alors l'intention était de capturer la valeur éphémère de la compréhension x dans une lambda, il n'est pas trivial: au lieu de [lambda: x ** 2 pour x dans la plage (3)] # (= > 4,4,4) quelque chose comme [functools.Partial (Lambda y = Aucun: y ** 2, y = x) pour x dans la plage (3)] # (=> 0, 1 , 4) est nécessaire.


4 Réponses :


2
votes

Peut-être que vous ne voulez pas de Lambdas du tout? Est-ce ce que vous voulez?

def testSetsFromStrings(tt):
    x1 = [my_function(x) for x in tt]
    return x1


5 commentaires

Eh bien, j'ai eu une fonction à la place de la Lambda plus tôt. Je veux pouvoir invoquer une fonction ou une lambda. La logique indiquée est une représentation beaucoup plus simple de ce que je veux faire - pour simplement vous demander comment invoquer une Lambda ou une fonction.


Vous devrez expliquer votre situation complète.


Mise à jour de l'OP. Si nécessaire, je vais convertir le lambda en une fonction multi-étapes qui inclut des instructions (telles que impression ) pour illustrer que j'ai vraiment besoin de la question initiale.


J'ai mis à jour ma réponse: invoquer une fonction si vous en avez besoin.


ok - donc un lambda ne donne que sens / travail ici; C'est une application directe de la logique ou invoquer une fonction . C'est une explication acceptable. Je vais accepter cette réponse après la requis quelques minutes.



0
votes

Vous pouvez également utiliser une fonction de carte au lieu d'une compréhension de la liste: xxx

si vous préférez la fonction LAMDA présentée. Ailleurs juste: xxx

comme mentionné des autres aussi.


0 commentaires

1
votes

Vous définissez la fonction, mais n'appliquez aucun argument à celui-ci:

Essayez cela à la place xxx

mais il serait préférable de simplement extraire la définition de la fonction En dehors de la compréhension si la fonction est compliquée, puis utilisez une carte ou une compréhension de la carte.


0 commentaires

0
votes

Qu'est-ce que vous devez comprendre, c'est que les Lambdas se comportent intrinsèquement eux-mêmes. Par conséquent, créez une fonction lambda et invoquez cela.

testSetsFromStrings = lambda x: x.split(' ')
x1 = [testSetsFromStrings(t) for t in tt]


0 commentaires