从列创建列表

问题描述 投票:0回答:1

我的文本文件中的数据格式如下:

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
,我想将其删除。

我希望了解如何改进此代码的任何想法。

clojure
1个回答
0
投票

一般来说,您不应该太在意对某件事进行多次迭代。这很常见,没关系,只有当你已经证明它是瓶颈时才考虑优化它。

关于空格 -

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))
© www.soinside.com 2019 - 2024. All rights reserved.