2016-11-27 31 views
-2

我是clojure的新手。我面臨的一個問題是從多個集合中找到特殊列表。查找來自clojure的多個收藏的列表

  1. 列表中的一個:(1 2 3 4 5)
  2. 列表中的兩個:(ABCDEF)

源列表:(1個C 2 B 4 EAF)
解釋在源找到列表:(a 1),(1a),(4c),(f 2)

如何解決?
感謝

+0

*源列表*如何確定*特殊組合*?另一個例子或兩個可能會有所幫助 – Thumbnail

+0

源列表恰好包含列表1和列表2中的項目。它可能不包含一個或兩個列表。這些組合不是由源列表確定的。他們是預先定義的。但是其中一個組合必須包含列表1和列表2中的一個。目標是在源列表中搜索每個組合。它不是要從這兩個列表中找到所有可能的組合。因此,另一組組合可以是(1f),(2e),(3c),(4b)。組合可能不是合適的詞。這只是兩個項目的列表。 – hnsyqz

+0

「源列表中的每個組合」所以你想排列? ([1 1 2] [1 2 1] [2 1 1]) ' – nha

回答

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] [1 B] [1個E] [1] [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來引入一些隨機性並使用拿n來獲得你需要的樣品。

或者爲了使它更簡單,只需從list1和list2中刪除不在源代碼中的項目並循環這些過濾列表。

+0

好主意!我也會嘗試更簡單的解決方案。 – hnsyqz