【发布时间】:2018-04-06 13:05:32
【问题描述】:
我有一个惰性序列,当发送到 println 时,显示如下:
(((red dog) (purple cat)) ((green mouse) (yellow bird)))
请注意,这是读取 csv 并修剪所有“单元格”值的结果,因此 (a) 在我想打印它时它是懒惰的,并且 (b) 在未来最里面的列表中可能会更多超过 2 个字符串,因为添加了更多列。
我正在尝试使用 clojure.pprint/print-table 将其打印在一个包含两列的表格中。我很难过,因为print-table 似乎想要一个带有数据的map。
这是一个再现:
;; Mock the lazy data retrieved from a csv file
(defn get-lazy-data []
(lazy-seq '('('("red" "dog") '("purple" "cat")) '('("green" "mouse") '("yellow" "bird")))))
(defn -main []
(let [data (get-lazy-data)]
(println "Starting...")
(println data)
(println "Continuing...")
(print-table data)
(println "Finished!")))
这给出了一个错误:
线程“main”java.lang.ClassCastException 中的异常:clojure.lang.Symbol 无法转换为 java.util.Map$Entry
我尝试了各种选择:
-
(print-table (apply hash-map data))给出同样的异常 -
(print-table (zipmap data))告诉我为键提供另一个参数,但我想要一个不依赖于事先指定列数的解决方案 - 理解和适应the answer to "Clojure printing lazy sequence",这将是我的问题的重复,如果不是问题和答案看起来都复杂得多,以至于我不知道如何将该解决方案转化为我自己的场景
基本上我知道我有an XY-problem,但现在我想要两个问题的答案:
- X:如何在控制台上以表格的形式漂亮地打印一对字符串对的惰性序列?
- Y:如何将惰性序列转换为映射(例如,键是索引)?
【问题讨论】:
-
(apply hash-map (flatten data))=>{purple cat, yellow bird, green mouse, red dog} -
但是如果最里面的列表有超过 2 个项目,这仍然有效吗? (我可能需要在我的问题中澄清可能发生的问题 - 我的数据来自具有 当前 2 列的 CSV,稍后会更多。)
-
第一个显然是错误的。以下适用于任意数量的值,按整数索引它们
(print-table (map #(zipmap (range) %) (apply concat data)))
标签: clojure