我刚接触过Clojure,玩它是为了好玩。
我正在读取一个CSV文件,并希望对每一列应用不同的函数。什么是优雅的(简洁和可读的)方法来做到这一点?我探索了两种方法:
每一行..。
(def row-1 ["John", "24"])...I希望对每个元素应用不同的函数,并获得以下结果:
["John", 24]我想使用的功能是:
(def converters-1 [identity, read-string])是否有一种简单的方法将converters-1函数应用于row-1元素?
使用此方法,我首先将每一行转换为一个映射:
(def row-2 {:name "John", :age "24"})编辑:我想获得这张地图:
{:name "John", :age 24}转换器还存储在地图中:
(def converters-2 {:name identity, :age read-string})是否有一种简单的方法将正确的转换器应用于row-2元素?
我有兴趣阅读这两种方法的解决方案。
最后,我会把数据放到地图上。我只是不确定我是想在得到这张地图之前还是之后进行转换。
发布于 2014-07-05 18:43:45
序列使用map;映射使用merge-with。
user=> (map #(% %2) converters-1 row-1)
("John" 24)
user=> (merge-with #(% %2) converters-2 row-2)
{:name "John", :age 24}发布于 2014-07-04 19:08:56
(map #(%1 %2) converters-1 row-1)
;; ("John" 24)如果是(def row-2 {:name "John", :age "24"}) (在您的示例中是一个整数)
(for [x (keys converters-2)] ((converters-2 x) (row-2 x)))
;; ("John" 24)发布于 2014-07-04 19:23:04
我为地图方法找到了一个解决方案,但它不如迭戈的矢量解决方案那么优雅。
(into {} (map (fn [[k v]]
[k ((converters-2 k) v)]
) row-2))这种地图方法有更简单的解决方案吗?我是不是缺少了一个可以简化它的核心功能?
编辑:阅读迭戈的编辑,我也可以使用keys
(into {} (map #(
[% ((converters-2 %) (row-2 %))] ; the key, and the converted value
) (keys row-2)))但是我更喜欢前面的解决方案,因为它不需要注释:键和值发生了什么,这是显而易见的。另外,在这个解决方案中,我只需要编写一次row-2。
编辑2:如果我编写(converters-2 k identity),那么我只需要指示需要转换的列。对于其他列(如这里的:name ),identity是默认的转换器。与矢量方法相比,这是一个优势。
编辑3:我为地图方法找到了另一个解决方案,使用update-in
(reduce #(update-in %1 [%2] (converters-2 %2)) row-2 (keys row-2))嗯,现在它已经写好了,对我的新手来说,阅读和理解都变得更加困难了。
到目前为止,向量解仍然是最好的。我会睁大眼睛寻找一个更好的地图解决方案,总有一天它会派上用场的。
https://stackoverflow.com/questions/24579405
复制相似问题