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",如果为真,则返回整个子向量)
我有一个包含一些字符串和整数的向量向量:
(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",如果为真,则返回整个子向量)