我的文本文件中的数据格式如下:
1 2
3 4
5 6
7 8
9 0
我想为每一列创建一个列表,因此:
((1 3 5 7 9) (2 4 6 8 0))
我实际上已经想出了一个可行的解决方案:
(defn make-lists []
(let [lines (clojure.string/split-lines (slurp "input"))]
(let [l1 (map #(parse-long (first (clojure.string/split % #" "))) lines)
l2 (map #(parse-long (nth (clojure.string/split % #" ") 3)) lines)]
(list l1 l2))))
但是,我认为这个解决方案存在一些问题。我实际上不确定
map
在底层是如何工作的,但我担心这会导致对输入进行两次迭代,而理论上一次就足够了。
不幸的是,输入数据中每一行的两个值之间有多个空格分隔。
clojure.string/split
为每一个结果生成一个结果。因此,我在代码中对 l2 进行了任意查找 nth 3
,我想将其删除。
我希望了解如何改进此代码的任何想法。
一般来说,您不应该太在意对某件事进行多次迭代。这很常见,没关系,只有当你已经证明它是瓶颈时才考虑优化它。
关于空格 -
str/split
的参数是正则表达式。只需使用 #" +"
代替 #" "
。
考虑到这一点,我就是这样做的:
(->> (clojure.string/split-lines "1 2\n3 4\n5 6\n7 8\n9 0")
(map #(map parse-long (clojure.string/split % #" +")))
(apply map list))