Clojure - 获取向量向量内的数据

时间:2015-10-16 16:42:24

标签: clojure lighttable

我有一个包含一些字符串和整数的向量向量:

(def data [
["a" "title" "b" 1]
["c" "title" "d" 1]
["e" "title" "f" 2]
["g" "title" "h" 1]
])

我试图遍历向量并返回(?)包含某个字符串的任何行,例如"&#34 ;.我尝试过这样的事情:

(defn get-row [data]
  (for [d [data]
        :when (= (get-in d[0]) "a")] d
  ))

我对Clojure很陌生,但我相信这是说:对于数据'中的每个元素(向量),如果该向量包含" a",则返回它?

我知道get-in需要2个参数,那部分是我不知道该怎么做的地方。

我查看了thisthis等答案,但我并不了解它们是如何运作的。从我可以收集的信息中,他们将矢量转换为地图并对其进行操作?

4 个答案:

答案 0 :(得分:4)

(filter #(some #{"a"} %) data)

看到集合#{"a"}有点奇怪,但它作为some的谓词函数。在集合中添加更多条目就像是逻辑OR,即

(filter #(some #{"a" "c"} %) data)
=> (["a" "title" "b" 1] ["c" "title" "d" 1])

答案 1 :(得分:1)

好的,你的代码中有错误

(defn get-row [data]
  (for [d [data]
        :when (= (get-in d[0]) "a")] d
  ))

错误在这里: (for [d [data] ... 遍历所有元素,不应将data括在括号中,因为此语法用于创建向量。在这里,您尝试遍历一个元素的向量。这就是clojure的样子:

    (for [d [[["a" "title" "b" 1]
              ["c" "title" "d" 1]
              ["e" "title" "f" 2]
              ["g" "title" "h" 1]]] ...

所以,正确的变体是:

(defn get-row [data]
  (for [d data
        :when (= "a" (get-in d [0]))]
    d))

然后,你可以使用clojure'解构:

(defn get-row [data]
  (for [[f & _ :as d] data
        :when (= f "a")]
    d))

但更多的clojuric方式是使用更高阶函数:

(defn get-row [data]
  (filter #(= (first %) "a") data))

这是关于你的代码。但是corretc变体是其他人的答案,因为在这里你只是检查第一项。

答案 2 :(得分:0)

(defn get-row [data]
  (for [d data ; <-- fix: [data] would result 
               ; in one iteration with d bound to data
        :when (= (get-in d[0]) "a")]
    d))

观察您的算法返回第一列为&#34; a&#34;的行。这可以e。 G。使用some解决,并使用set as谓词函数扫描整行。

(defn get-row [data]
  (for [row data
        :when (some #{"a"} row)]
    row))

答案 3 :(得分:0)

甚至比当前选择的答案更好,这可行:

(filter #(= "a" (% 0)) data)

这样做的原因是,对于最佳答案,您正在搜索查询的子向量的所有索引,而您可能只想查看每个子向量的第一个索引 (在这种情况下,在返回整个子向量之前,搜索每个位置0为&#34; a&#34;,