2 votes

retirer un élément de la liste et garder une trace de la liste modifiée

Supposons qu'il existe une liste appelée xs . Cette liste doit être filtrée par un prédicat et un élément aléatoire doit être prélevé dans le résultat :

(rand-nth (filter pred? xs))

Cela renverrait un élément de la liste. Que faire si, en plus, la liste originale (moins l'élément extrait) doit être conservée ?

Ces deux étapes sont-elles nécessaires ou existe-t-il un moyen plus rapide de procéder ?

(let [item (rand-nth (filter pred? xs))
      new-xs (remove (partial = item) xs)]
   ...)

1voto

Piotr Bzdyl Points 11

Votre solution échouera en cas d'éléments dupliqués dans votre entrée. xs car tous les doublons seront supprimés lors de la sélection aléatoire.

Je préfère choisir moi-même un indice aléatoire et l'utiliser directement :

(defn remove-nth [xs n]
  (when (seq xs)
    (if (vector? xs)
      (concat
        (subvec xs 0 n)
        (subvec xs (inc n) (count xs)))
      (concat 
        (take n xs)
        (drop (inc n) xs)))))

(defn remove-random [xs]
  (if (seq xs)
    (let [index (rand-int (count xs))
          item (nth xs index)
          remaining (remove-nth xs index)]
      [item remaining])))

1voto

leetwinski Points 10333

Vous pourriez également le faire sans conserver la liaison pour item comme ceci :

user> (defn split-rnd [pred coll]
        (let [[l [it & r]] (split-with (complement
                                        #{(rand-nth (filter pred coll))})
                                       coll)]
          [it (concat l r)]))
#'user/split-rnd

user> (split-rnd pos? [-1 2 -3 4 -5 6 -7])
[4 (-1 2 -3 -5 6 -7)]

user> (split-rnd pos? [-1 2 -3 4 -5 6 -7])
[6 (-1 2 -3 4 -5 -7)]

user> (split-rnd pos? [-1 2 -3 4 -5 6 -7])
[2 (-1 -3 4 -5 6 -7)]

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