Clojure 如何实现n的可变索引数
我的问题是如何在不知道编译时有多少元素的情况下,从序列中提取大量元素。我想到了使用partial,但我一直很难提取元素而不是序列 我想实现下面交织生成的序列,但不需要在有限数量的映射形式中进行编码Clojure 如何实现n的可变索引数,clojure,Clojure,我的问题是如何在不知道编译时有多少元素的情况下,从序列中提取大量元素。我想到了使用partial,但我一直很难提取元素而不是序列 我想实现下面交织生成的序列,但不需要在有限数量的映射形式中进行编码 (def s1 [[:000-00-0000 "TYPE 1" "JACKSON" "FRED"] [:000-00-0001 "TYPE 2" "SIMPSON" "HOMER"] [:000-00-0002 "TYPE 4" "SMITH" "SUSAN"]])
(def s1 [[:000-00-0000 "TYPE 1" "JACKSON" "FRED"]
[:000-00-0001 "TYPE 2" "SIMPSON" "HOMER"]
[:000-00-0002 "TYPE 4" "SMITH" "SUSAN"]])
(interleave (map #(nth % 0 nil) s1)
(map #(nth % 2 nil) s1)
(map #(nth % 3 nil) s1))
(:000-00-0000 "JACKSON" "FRED"
:000-00-0001 "SIMPSON" "HOMER"
:000-00-0002 "SMITH" "SUSAN")
如果我这样做
(def cols [0 2 3])
(defn f1
[s1 col]
(nth s1 col nil))
(map (partial f1 s1) cols)
我明白了
([:000-00-0000 "TYPE 1" "JACKSON" "FRED"]\
[:000-00-0002 "TYPE 4" "SMITH" "SUSAN"] nil)
我相信我知道为什么会这样。cols参数的作用类似于序列选择器,而不是序列中的元素选择器。我想从每个序列中提取几个元素。如何从每个序列中提取元素
谢谢。您可以使用
get in
函数访问嵌套数据结构,如下所示:
(def cols[0 2 3])
(定义f1
[s1列]
(映射#(进入s1[%col]nil)(范围(计数s1)))
(应用交织(映射(部分f1 s1)列))
(:000-00-0000“杰克逊”“弗雷德”
:000-00-0001“辛普森”“荷马”
:000-00-0002“史密斯”“苏珊”)
您可以使用for
和分区更简洁地执行此操作:
user> (defn get-cols [s cols] (partition (count cols) (for [ws s c cols] (ws c))))
#'user/get-cols
user> (get-cols [[:000-00-0000 "TYPE 1" "JACKSON" "FRED"]
[:000-00-0001 "TYPE 2" "SIMPSON" "HOMER"]
[:000-00-0002 "TYPE 4" "SMITH" "SUSAN"]]
[0 2 3])
((:000-00-0000 "JACKSON" "FRED") (:000-00-0001 "SIMPSON" "HOMER") (:000-00-0002 "SMITH" "SUSAN"))
这也将保留原始分组。我将这样做:
(apply concat (map (juxt first #(nth % 2) #(nth % 3)) s1))
这首先将s1中的列收集到中间向量中,然后将这些向量展平一级,得到结果
这里有两个非常方便的功能:
- “应用concat”类似于“展平”,但只有一层深
- juxt返回一个函数a,该函数将传递给juxt的参数(必须是函数)应用于传递给a的值,并返回结果的向量
Multo Bene!非常感谢,谢谢你。我把它加到我的技能袋里。我的变量名有点臭。由于我在for'(ws-c')中所做的索引,这只适用于向量。要处理所有序列,您需要使用nth。