0
votes

Comment puis-je itération sur des articles de deux listes différentes de Clojure à Lockstep?

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 ne pas itérer sur les éléments correspondants, mais toutes les combinaisons possibles: xxx


5 commentaires

... cela a dit que le pour n'est pas équivalent au de Python pour (c'est paresseux et ne force pas l'évaluation); Je me demande si vous voulez doseq .


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 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)) 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 plus efficace, je suis curieux de savoir si nous avons quelque chose d'autre.


3 Réponses :


2
votes

Un équivalent idiomatique peut être: xxx pré>

... ou, en tant que version expansée de celle qui vous a toujours écrit votre propre boucle: P>

(doseq [i (range (count a))]
  (do-something (nth a i) (nth b i)))
  • car 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>

    Une traduction plus directe pourrait ressembler à: p> xxx pré>

    ... mais n'utilisez pas ça; comptent code> et NTH code> peut être lent ou indisponible, en fonction des types de collecte spécifiques utilisés. P> P>


0 commentaires

1
votes

Ajoutez la condition "si" dans la boucle:

(doseq [[x y] (map vector a b)
        :when (= x y)]
 (do_something x y))


1 commentaires

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.



0
votes

Si vous souhaitez utiliser une fonction de commodité, J'ai déjà un qui fait cela: xxx

Vous écrivez donc les liaisons sur x et y comme un < Code> Soit formulaire, mais il fonctionne ensuite sur les "variables" locales comme dans un mapv .


0 commentaires