2 votes

Clojure - Combiner deux listes par index

Comment combiner deux listes ? '(1 2 3 4) y '(:a :b :c :d) pour obtenir (1 :a 2 :b 3 :c 4 :d)

Comme je ne peux pas faire n'importe quoi concat car cela ajouterait la deuxième liste à la fin de la première.

J'ai pensé à faire quelque chose comme

user=> (def a '(1 2 3 4))

user=> (def b '(:a :b :c :d))

user=> (def x (apply conj (second (split-at 1 a)) (nth b 0) (reverse (first (split-at 1 a)))))
(1 :a 2 3 4)

user=> (def y (apply conj (second (split-at 3 x)) (nth b 1) (reverse (first (split-at 3 x)))))
(1 :a 2 :b 3 4)

user=> (def z (apply conj (second (split-at 5 y)) (nth b 2) (reverse (first (split-at 5 y)))))
(1 :a 2 :b 3 :c 4)

user=> (def q (apply conj (second (split-at 7 z)) (nth b 3) (reverse (first (split-at 7 z)))))
(1 :a 2 :b 3 :c 4 :d)

Mais je pense qu'il y a une meilleure façon de procéder

Toute aide serait très appréciée

6voto

Thumbnail Points 2615

Utilisation interleave :

(interleave '(1 2 3 4) '(:a :b :c :d))
=> (1 :a 2 :b 3 :c 4 :d)

1voto

Chris Murphy Points 41

Une alternative à interleave :

(mapcat list '(1 2 3 4) '(:a :b :c :d))
;;=> (1 :a 2 :b 3 :c 4 :d)

Ici mapcat fait effectivement le cat l'opération après la double map a correctement ordonné les éléments, bien qu'il s'agisse de tuples de listes, de sorte que l'opération '(1 :a) etc.

Plus explicitement :

(apply concat (map list '(1 2 3 4) '(:a :b :c :d))))
;;=> (1 :a 2 :b 3 :c 4 :d)

Ainsi, si votre première liste est constituée de valeurs entières croissantes, vous n'avez pas besoin de les générer :

(apply concat (map-indexed list '(:a :b :c :d)))
;;=> (0 :a 1 :b 2 :c 3 :d)

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