在clojure中合并不同大小的列表

在clojure中合并不同大小的列表,clojure,Clojure,我有两张单子 s=[12345] 及 p=[:a:b:c:d:e:f:h:i:j:k:l:m] 我想从p中取N个元素,其中N是1到K之间的随机数,并创建从s到p中这些N个元素的映射 生成的映射可能类似于 ((1:a)(1:b)(1:c)(2:d)(2:e)(3:f)(4:h)(4:i)(5:j)(5:k)(5:l)) 对于K=3 如果没有使用p中的所有元素,但有足够的元素覆盖s中所有元素的N为max的情况,这是可以的 我已经想出了这个方法,但是它缺少了take random N elements

我有两张单子

s=[12345]

p=[:a:b:c:d:e:f:h:i:j:k:l:m]

我想从p中取N个元素,其中N是1到K之间的随机数,并创建从s到p中这些N个元素的映射

生成的映射可能类似于

((1:a)(1:b)(1:c)(2:d)(2:e)(3:f)(4:h)(4:i)(5:j)(5:k)(5:l))

对于K=3

如果没有使用p中的所有元素,但有足够的元素覆盖s中所有元素的N为max的情况,这是可以的

我已经想出了这个方法,但是它缺少了take random N elements部分,并为s中的每个元素分配了(几乎)相等数量的元素

(分区2(交织(循环s)(洗牌p))

这导致

((1:d)(2:f)(3:h)(4:e)(5:l)(1:b)(2:k)(3:a)(4:j)(5:g)(1:i)(2:c)(3:m))

更新: 为了更好地理解这个问题,让我再添加一些上下文。
我试图生成一个星系,在这个星系中,每颗恒星的系统中都有1到N颗行星。s列表包含恒星的ID,p列表包含行星的ID。我想将行星ID映射到恒星ID,这样每个系统中都有1到N个随机行星。

每个恒星都必须有一个随机数目的行星。此处至少1个,但最多3个:

(def stars [1 2 3 4 5])
(def planets [:a :b :c :d :e :f :h :i :j :k :l :m])

(let [max-num-planets 3
      solar-systems (mapcat #(repeat (inc (rand-int max-num-planets)) %) stars)]
  (map #(list %1 %2) solar-systems (shuffle planets))
每次你运行它,答案都会不同,但每个恒星都会被包括在内,因为每个恒星都有1到3颗行星。示例输出:

;; ((1 :a) (1 :b) (1 :c) (2 :d) (2 :e) (3 :f) (4 :h) (4 :i) (4 :j) (5 :k) (5:l) (5 :m))
;; ((1 :a) (1 :b) (1 :c) (2 :d) (3 :e) (3 :f) (4 :h) (5 :i))

并非所有的行星都会被使用,而且一颗行星永远不会重复——因为当然,一颗行星不可能存在于多个太阳系中。

每颗恒星都必须有随机数目的行星。此处至少1个,但最多3个:

(def stars [1 2 3 4 5])
(def planets [:a :b :c :d :e :f :h :i :j :k :l :m])

(let [max-num-planets 3
      solar-systems (mapcat #(repeat (inc (rand-int max-num-planets)) %) stars)]
  (map #(list %1 %2) solar-systems (shuffle planets))
每次你运行它,答案都会不同,但每个恒星都会被包括在内,因为每个恒星都有1到3颗行星。示例输出:

;; ((1 :a) (1 :b) (1 :c) (2 :d) (2 :e) (3 :f) (4 :h) (4 :i) (4 :j) (5 :k) (5:l) (5 :m))
;; ((1 :a) (1 :b) (1 :c) (2 :d) (3 :e) (3 :f) (4 :h) (5 :i))

并非所有的行星都被使用,而且一颗行星永远不会重复——因为当然一颗行星不可能存在于多个太阳系中。

我希望我正确理解了你的问题:

(def s [1 2 3 4 5])
(def p [:a :b :c :d :e :f :h :i :j :k :l :m])
(def k 3)

;; concatenate corresponding elements from two sequences into 2-element vectors
(map vector
     ;; generate a sequence of elements from s each duplicated 1 to k times
     (mapcat #(repeat (inc (rand-int k)) %) s)
     ;; generate infinite shuffled seq of elements from p
     (cycle (shuffle p)))
示例输出:

([1 :f] [2 :j] [2 :b] [3 :m] [3 :a] [4 :i] [5 :l] [5 :c] [5 :e])

我希望我正确理解了你的问题:

(def s [1 2 3 4 5])
(def p [:a :b :c :d :e :f :h :i :j :k :l :m])
(def k 3)

;; concatenate corresponding elements from two sequences into 2-element vectors
(map vector
     ;; generate a sequence of elements from s each duplicated 1 to k times
     (mapcat #(repeat (inc (rand-int k)) %) s)
     ;; generate infinite shuffled seq of elements from p
     (cycle (shuffle p)))
示例输出:

([1 :f] [2 :j] [2 :b] [3 :m] [3 :a] [4 :i] [5 :l] [5 :c] [5 :e])

我不清楚如何将元素从s映射到p。我也不确定你的第一个例子是否正确。你写道:“我想从p中取N个元素,其中N是1到K之间的一个随机数,然后创建一个从s到p中这些N个元素的映射。”但是你说的是K=3,而不是N=3。第一个示例结果如何受p中3个随机元素的约束,因为它包含11个不同的元素(
:a
:l
)?@PiotrekBzdyl我的意思是我从1到K中选择一个随机数,比如K=3我得到2。然后我从p中选择2个元素,并创建从s中的第一个元素到这2个元素的映射。然后我会将这些元素从p中丢弃,并对s中的下一个元素执行相同的过程,因此我不清楚如何将元素从s映射到p。我也不确定你的第一个例子是否正确。你写道:“我想从p中取N个元素,其中N是1到K之间的一个随机数,然后创建一个从s到p中这些N个元素的映射。”但是你说的是K=3,而不是N=3。第一个示例结果如何受p中3个随机元素的约束,因为它包含11个不同的元素(
:a
:l
)?@PiotrekBzdyl我的意思是我从1到K中选择一个随机数,比如K=3我得到2。然后我从p中选择2个元素,并创建从s中的第一个元素到这2个元素的映射。然后我将这些元素从p中丢弃,并对s中的下一个元素执行相同的程序,以此类推,结果是每个s元素的p元素数量相同(每个s元素3个)以上的评论不再相关-在OP给我们提供上下文之前-这是关于将行星分配给恒星的,每个恒星都有一个随机数目的行星。这导致每个s元素的p元素数相同(每个3个)上述评论不再相关-在OP给我们提供上下文之前-这是关于将行星分配给恒星的,其中每个恒星都有一个随机数目的行星。您可能应该删除
循环
,因为你不能将一颗行星分配给一颗以上的恒星(见问题更新)。这个更新并没有告诉我我们应该循环,但如果OP需要这样做,那么你是对的。你的解决方案中有一个问题。你可以输出一个项目少于PYO的seq。你可能应该删除
周期,因为你不能将一个行星分配给多个恒星(请参阅问题更新)。此更新没有向我表明我们应该循环,但如果OP需要循环,那么你是对的。你的解决方案中存在问题。您可以输出项目少于p的序号