Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何实现n的可变索引数_Clojure - Fatal编程技术网

Clojure 如何实现n的可变索引数

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"]])

我的问题是如何在不知道编译时有多少元素的情况下,从序列中提取大量元素。我想到了使用partial,但我一直很难提取元素而不是序列

我想实现下面交织生成的序列,但不需要在有限数量的映射形式中进行编码

(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。