J'ai deux listes dans le clojure A et B qui ont la même longueur. Je veux faire ce que j'ai essayé, mais n'a pas fonctionné. pour code> ne pas itérer sur les éléments correspondants, mais toutes les combinaisons possibles: p>
3 Réponses :
Un équivalent idiomatique peut être: ... ou, en tant que version expansée de celle qui vous a toujours écrit votre propre boucle: P> Une traduction plus directe pourrait ressembler à: p> ... mais n'utilisez pas ça; (doseq [i (range (count a))]
(do-something (nth a i) (nth b i)))
pour code> est paresseux, il peut ne pas réellement évaluer toute votre séquence à moins que quelque chose consomme son résultat; doseq code> appelle toujours fais-quelque chose code> sur tout. li>
Carte quelqueefunc arg1 arg2 code> Appels Quelquesfunc code> avec chaque ensemble de valeurs dans arg1 code> et arg2 code>, exactement ce que vous 'Re cherche ici. Li>
ul>
comptent code> et NTH code> peut être lent ou indisponible, en fonction des types de collecte spécifiques utilisés. P> P>
Ajoutez la condition "si" dans la boucle:
(doseq [[x y] (map vector a b)
:when (= x y)]
(do_something x y))
Heh - J'ai tout à fait oublié cette partie de la question. Cela dit, si les valeurs sont égales, pourquoi passer deux arguments différents du tout? Cela sent quelque chose où la logique a été écrite en supposant des valeurs mutables.
Si vous souhaitez utiliser une fonction de commodité, J'ai déjà un qui fait cela: Vous écrivez donc les liaisons sur x code> et y code> comme un < Code> Soit code> formulaire, mais il fonctionne ensuite sur les "variables" locales comme dans un mapv code>. p> p> p>
... cela a dit que le
pour code> n'est pas équivalent aude Python pour code> (c'est paresseux et ne force pas l'évaluation); Je me demande si vous voulezdoseq code>.Cela dit - quels types sont vos arguments de clojure? S'ils sont des vecteurs, une traduction directe du code Python fonctionnera (pour régulier
SEQ code> S, obtenir la longueur en haut peut être une opération coûteuse).Hmm. Vraiment, vous pouvez simplement
(DOTALL (Carte Do-quelque chose A B)) CODE> et n'a pas besoin de la boucle du tout.Dotall s'est avéré être beaucoup plus efficace.
Hmm. Cela va être un peu plus efficace car il ne crée pas des vecteurs transitoires qui viennent de prendre des ordures collectées, mais si c'est beaucoup plus efficace i> plus efficace, je suis curieux de savoir si nous avons quelque chose d'autre.