我有一个包含一些字符串和整数的向量向量:
(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个参数,那部分是我不知道该怎么做的地方。
我查看了this和this等答案,但我并不了解它们是如何运作的。从我可以收集的信息中,他们将矢量转换为地图并对其进行操作?
答案 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;,