【问题标题】:Merging lists of different sizes in clojure在clojure中合并不同大小的列表
【发布时间】:2017-03-30 19:13:32
【问题描述】:

我有 2 个列表

s = [1 2 3 4 5]

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 为最大值的情况。

我想出了这个,但它缺少随机 N 个元素部分,并为 s 中的每个元素分配(几乎)相等数量的元素

(partition 2 (interleave (cycle s) (shuffle 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 个随机行星。

【问题讨论】:

  • 我不清楚您希望如何将元素从 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 中的下一个元素执行相同的过程,依此类推

标签: clojure


【解决方案1】:

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

(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])

【讨论】:

  • 您可能应该删除cycle,因为您不能将一颗行星分配给多个恒星(请参阅问题更新)。
  • 此更新并未向我表明我们应该循环,但如果那是 OP 需要的,那么你是对的。
  • 您的解决方案有问题。你可以输出一个比 p 少的序列
【解决方案2】:

每颗恒星必须有随机数量的行星。这里至少 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))

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

【讨论】:

  • 这导致每个 s 元素的 p 元素数量相同(每个 3 个)
  • 上面的评论不再相关——在 OP 给我们提供上下文之前——这是关于将行星分配给恒星,其中每颗恒星都有随机数量的行星。
猜你喜欢
  • 1970-01-01
  • 2017-09-18
  • 2017-12-26
  • 2013-09-27
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多