使用clojure从地图中删除关键点
我有一张表格里的地图使用clojure从地图中删除关键点,clojure,Clojure,我有一张表格里的地图 ({:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0}) 我只希望返回值,不希望返回键。我尝试使用vals函数,但仅当其形式为{:a1.0,:b2.0}时才使用 还尝试使用for循环,然后使用peek功能。但是当我使用peek函数时,我得到了nil,因为这里的第一个元素是map 我想返回这个:{[1.0 2.0][3.0 1.0][3.0 1.0][4.0
({:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0})
我只希望返回值,不希望返回键。我尝试使用vals
函数,但仅当其形式为{:a1.0,:b2.0}
时才使用
还尝试使用for
循环,然后使用peek
功能。但是当我使用peek
函数时,我得到了nil
,因为这里的第一个元素是map
我想返回这个:
{[1.0 2.0][3.0 1.0][3.0 1.0][4.0 1.0][12.0 2.0][3.0 1.0]}
你需要澄清你的问题。您的输入不是地图,而是一系列地图。您需要一个向量序列的结果
使用向量表示法(vec of maps,vec of vecs)写出它们。请注意,您的建议答案中也有一个错误,我已更正
(ns tst.clj.core
(:use clj.core
clojure.test ))
(def vec-of-maps [ {:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0} ] )
(def answer [ [1.0 2.0] [3.0 1.0] [4.0 1.0] [12.0 2.0] [3.0 1.0] ] )
(defn ff
[data]
(forv [curr-map data]
(vec (vals curr-map))))
(deftest tt
(is (= answer (ff vec-of-maps))))
请注意,如果我们只关心等式,我们实际上不需要将结果强制转换为向量。我们可以使用下面的f2
,得到一个序列作为输出,它等于一个vec的vec:
(defn f2
[data]
(for [curr-map data]
(vals curr-map)))
这里有地图列表。要获取
VAL
,您可以map
user=> (map vals '({:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0}))
((1.0 2.0) (3.0 1.0) (4.0 1.0) (12.0 2.0) (3.0 1.0))
还要注意的是,贴图不是按顺序排列的(对于小的关键点集,它们看起来是按顺序排列的)。因此,如果要确保获得:A
和:B
的值,可以使用juxt
和所需的键:
user=> (map (juxt :A :B) '({:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0}))
([1.0 2.0] [3.0 1.0] [4.0 1.0] [12.0 2.0] [3.0 1.0])
我想退回这个:
{[1.02.0][3.01.0][3.01.0][4.01.0][12.02.0][3.01.0]}
不,你没有!你想回来吗
[[1.0 2.0][3.0 1.0][3.0 1.0][4.0 1.0][12.0 2.0][3.0 1.0]]
或同等清单
如果我们有
(def数据[{:a1.0,:b2.0}{:a3.0,:b1.0}{:a4.0,:b1.0}
{:A 12.0,:B 2.0}{:A 3.0,:B 1.0}])
然后
正如所观察到的,这个解决方案是不够的,因为它不能保证每个子列表的顺序 你能在每次回答时不使用你的库来回答问题吗?这与SO的精神背道而驰,可能会让初学者感到困惑。这篇回复中没有使用它,只是一个剩余的声明。哦,不!!我甚至使用了juxt函数,但我没有得到它。谢谢你!
(map vals data)
;((1.0 2.0) (3.0 1.0) (4.0 1.0) (12.0 2.0) (3.0 1.0))