作为一名Clojure新手,我对这个小问题感到困扰:
我想迭代序列并执行split
,然后在序列元素上执行str
(串联)函数。
这是我的序列:
(("2.660.784") ("2.944.552") ("44.858.797"))
我想得的是这样的:
("2660784" "2944552" "44858797")
这是我尝试为我的问题创建递归解决方案:
(defn old
[squence]
(let [size (count squence)]
(loop [counter 1]
(if (<= counter size)
(apply str (clojure.string/split
(first (first squence))
#"\b\.\b"
))
(old (rest squence)))
)))
当然,这不是解决方案,因为它仅将split
和str
应用于一个元素,但我想对squence
中的每个元素重复此操作。 squence
是我项目中其他一些功能的产物。
我肯定错过了一些东西所以请帮我解决这个问题...
答案 0 :(得分:6)
编写它的最简单方法是使用replace
,而不是split
/ str
。一旦你编写了一个可以对单个字符串进行转换的函数,就可以使用map
或for
对一系列字符串进行转换。在这里我不得不进行一些构造,因为无论出于何种原因,序列中的每个元素本身都是另一个序列;我刚拿出第一个元素。
(for [[s] '(("2.660.784") ("2.944.552") ("44.858.797"))]
(clojure.string/replace s #"\b\.\b" ""))
答案 1 :(得分:3)
user=> (defn reject-char-from-string
[ch sequence]
(map #(apply str (replace {ch nil} (first %))) sequence))
#'user/reject-char-from-string
user=> (reject-char-from-string \. '(("2.660.784") ("2.944.552") ("44.858.797"))
)
("2660784" "2944552" "44858797")
答案 2 :(得分:1)
试过这个?
=> (flatten '(("2.660.784") ("2.944.552") ("44.858.797")))
("2.660.784" "2.944.552" "44.858.797")
答案 3 :(得分:1)
这么简单吗?
(def data '(("2.660.784") ("2.944.552") ("44.858.797")))
(require '[clojure.string :as string])
(map #(string/replace (first %1) "." "") data)
;=> ("2660784" "2944552" "44858797")