Clojure:如何在另一个向量中获取向量的元素

时间:2018-04-08 19:26:24

标签: vector clojure maps

我是Clojure的新手,很难理解矢量/列表/地图的操作。我试图打印出数据中所有客户的名字,但我无法弄清楚如何。请帮忙。

(def data
"1|John Smith|123 Here Street|456-4567
2|Sue Jones|43 Rose Court Street|345-7867
3|Fan Yuhong|165 Happy Lane|345-4533")

(defn test
[]
  (let [lines       (str/split-lines data)
        line-vecs-1 (mapv #(str/split % #"\|" ) lines)]
       (for [x line-vector-c] (print (line-vector-c 1))
       )
  )
)

给了我:

 [2 Sue Jones 43 Rose Court Street 345-7867][2 Sue Jones 43 Rose Court Street 
 345-7867][2 Sue Jones 43 Rose Court Street 345-7867]

我想要的是什么:

"John Smith"
"Sue Jones"
"Fang Yuhong"

4 个答案:

答案 0 :(得分:3)

到目前为止(略有改写)你得到的是:

(mapv (fn [l]
        (str/split l #"\|"))
      (str/split-lines data))

(str/split-lines data)将行拆分为一系列字符串:

["1|John Smith|123 Here Street|456-4567"
 "2|Sue Jones|43 Rose Court Street|345-7867"
 "3|Fan Yuhong|165 Happy Lane|345-4533"]

(mapv #(str/split % #"\|") lines)将每一行拆分为字符串元组:

[["1" "John Smith" "123 Here Street" "456-4567"] 
 ["2" "Sue Jones" "43 Rose Court Street" "345-7867"]
 ["3" "Fan Yuhong" "165 Happy Lane" "345-4533"]]

现在,您希望将每个字符串元组转换为每个元组的第二个元素。您可以使用以下几种功能:getnth(两者都是从零开始)。

例如:

(mapv (fn [l]
        (get (str/split l #"\|")
             1))
      (str/split-lines data))

答案 1 :(得分:1)

您可以使用

获取名称列表
(doseq [n names]
  (println n))

然后用

打印每个名字
sequence

我经常使用{{1}}和组合传感器来探索数据,因为它可以方便地一步一步地构建变换。

答案 2 :(得分:0)

您可以拆分每一行并获得第二列,如下所示

(defn test [xs]
    (->> (str/split-lines xs)       ;split lines
         (map #(str/split % #"\|")) ;get columns
         (map second)))             ;only the second element of each line

并打印结果

(map println (test data))

或更好地使用 doseq 进行打印

(doseq [n (test data)]
  (println n))

答案 3 :(得分:0)

使用RegEx:

(map second (re-seq #"\|(.*?)\|" data))

返回:

("John Smith" "Sue Jones" "Fan Yuhong")

解释

重新SEQ

我们要求re-seq在每一行找到一对|之间的第一个内容。正则表达式中的?意味着我们需要非贪婪的搜索。

(re-seq #"\|(.*?)\|" data)

返回:

(["|John Smith|" "John Smith"] ["|Sue Jones|" "Sue Jones"] ["|Fan Yuhong|" "Fan Yuhong"])

地图

最后,我们使用map second访问列表的每个元素,并仅获取向量的第二个字符串。