4

データを埋め込みベクトルとしてモデル化しました。これらのベクトル内に要素が存在するかどうかを確認する必要があります。私はそれを正しく行う以下のコードを持っています。ただし、より慣用的な方法でそれを行うための提案が必要です。

(defn exists-in-vector?
  [my-vec my-sym]
  (= my-sym (first my-vec)))

(defn exists-in-vectors?
  [all-vectors my-symbol]
  (empty? (for [first-vector all-vectors
               second-vector first-vector
               third-vector second-vector
               :when (exists-in-vector? third-vector my-symbol)
               :while (exists-in-vector? third-vector my-symbol)]
           true)))

> (exists-in-vectors? [[[[:a 20] [:b :30]] [[:c 20] [:d :30]]]
                      [[[:h 20] [:g :30]] [[:f 20] [:e :30]]]]
                      :a) => true
4

3 に答える 3

9

これは、「フラット化」がまさにあなたが望むものである数少ないケースの 1 つです。

(def vectors [[[[:a 20] [:b :30]] [[:c 20] [:d :30]]] 
             [[[:h 20] [:g :30]] [[:f 20] [:e :30]]]])

(some #{:g} (flatten vectors))
;=> :g

(some #{:k} (flatten vectors))
;=> nil

ところで、flatten の定義は興味深いものです。(ソースの平坦化) またはhttp://clojuredocs.org/clojure_core/clojure.core/flatten :

(defn flatten
  "順次のもの (リスト、ベクトル、
  など)、その内容を単一のフラットなシーケンスとして返します。
  (flatten nil) は nil を返します。"
  {:「1.2」を追加
   :静的真}
  [バツ]
  (フィルター (補完シーケンシャル?)
          (rest (tree-seq 順次? seq x))))
于 2013-04-28T04:46:18.353 に答える
5

ネストされたベクトルはツリーと見なすことができます

(def tree [[[[:a 20] [:b :30]] [[:c 20] [:d :30]]] 
           [[[:h 20] [:g :30]] [[:f 20] [:e :30]]]])

(some #(= :a %) (tree-seq vector? identity tree))
;=> true

(some #(= :k %) (tree-seq vector? identity tree))
;=> nil
于 2013-04-27T16:07:42.157 に答える
1
user=> (defn in-nested? [thing elt]
  #_=>   (if (vector? thing) 
  #_=>       (boolean (some #(in-nested? % elt) thing)) 
  #_=>       (= thing elt)))
#'user/in-nested?

user=> (def data [[[[:a 20] [:b :30]] [[:c 20] [:d :30]]] [[[:h 20] [:g :30]] [[:f 20] [:e :30]]]])
#'user/data

user=> (in-nested? data :a)
true
user=> (in-nested? data :c)
true
user=> (in-nested? data :z)
false
user=> (in-nested? data 20)
true
user=> (in-nested? data 40)
false
于 2013-04-27T15:21:48.733 に答える