Clojure - 在向量的向量中获取数据

Clojure - get data inside vector of vectors

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

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

我正在尝试遍历向量和 return(?) 任何包含特定字符串的行,例如"a"。我尝试实现这样的事情:

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

我对 Clojure 很陌生,但我相信这是在说:对于 'data' 中的每个元素(向量),如果该向量包含 "a"、return 呢?

我知道进入需要 2 个参数,那部分是我不确定要做什么的地方。

我看过 this and this 之类的答案,但我不太明白它们是如何工作的。据我所知,他们正在将矢量转换为地图并对其进行操作?

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

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

(filter #(some #{"a" "c"} %) data)
=> (["a" "title" "b" 1] ["c" "title" "d" 1])
(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))

观察您的算法 returns 行,其中第一列是 "a"。这可以e。 G。使用 some 和集合作为谓词函数扫描整行来解决。

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

好的,您的代码有误

(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 变体在其他人的答案中,因为这里你只检查第一项。

甚至比当前选择的答案更好,这会起作用:

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

这是因为对于最佳答案,您正在为查询搜索子向量的所有索引,而您可能只想查看每个子向量的第一个索引(在这种情况下,在每个位置 0 中搜索 "a",如果为真,则返回整个子向量)