在clojure中查找来自多个集合的列表

时间:2016-11-27 14:23:31

标签: collections clojure combinations

我是clojure的新手。我面临的一个问题是从多个集合中找到特殊列表。

  1. 列表一:(1 2 3 4 5)
  2. 清单二:(a b c d e f)
  3. 来源清单:(1 c 2 b 4 e a f)
    在源列表中找到的列表:(a 1),(1a),(4 c),(f 2)

    如何解决? 感谢

2 个答案:

答案 0 :(得分:2)

查看https://github.com/clojure/math.combinatorics

=> (combo/cartesian-product [1 2] [3 4])
((1 3) (1 4) (2 3) (2 4))

答案 1 :(得分:0)

如果我对问题的理解是正确的并且你不介意暴力,你可以使用这个解决方案。

(let [list1  '#{1 2 3 4 5}
      list2  '#{a b c d e f}
      source '(1 c 2 b 4 e a f)]
  (for [x     source
        y     source
        :when (or (and (list1 x) (list2 y))
                  (and (list1 y) (list2 x)))]
    [x y]))

=>

([1 c] [1b] [1 e] [1 a] [1 f] [c 1] [c 2] [c 4] [2 c] [2 b] [2 e] [2 a] [2 f] [b 1] [b 2] [b 4] [4 c] [4 b] [4 e] [4 a] [4 f] [e 1] [e 2] [e 4] [a 1] [a 2] [a 4] [f 1] [f 2] [f 4])

你也可以使用shuffle来引入一些随机性,并使用take n来获取你需要的样本。

或者为了使其更简单,只需从list1和list2中删除不在源中的项目并循环遍历这些过滤后的列表。