首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure -如何将不同的函数应用于每一列?

Clojure -如何将不同的函数应用于每一列?
EN

Stack Overflow用户
提问于 2014-07-04 18:33:28
回答 3查看 209关注 0票数 1

我刚接触过Clojure,玩它是为了好玩。

我正在读取一个CSV文件,并希望对每一列应用不同的函数。什么是优雅的(简洁和可读的)方法来做到这一点?我探索了两种方法:

  • 处理行向量:

每一行..。

代码语言:javascript
复制
(def row-1 ["John", "24"])

...I希望对每个元素应用不同的函数,并获得以下结果:

代码语言:javascript
复制
["John", 24]

我想使用的功能是:

代码语言:javascript
复制
(def converters-1 [identity, read-string])

是否有一种简单的方法将converters-1函数应用于row-1元素?

  • 正在绘制地图:

使用此方法,我首先将每一行转换为一个映射:

代码语言:javascript
复制
(def row-2 {:name "John", :age "24"})

编辑:我想获得这张地图:

代码语言:javascript
复制
{:name "John", :age 24}

转换器还存储在地图中:

代码语言:javascript
复制
(def converters-2 {:name identity, :age read-string})

是否有一种简单的方法将正确的转换器应用于row-2元素?

我有兴趣阅读这两种方法的解决方案。

最后,我会把数据放到地图上。我只是不确定我是想在得到这张地图之前还是之后进行转换。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-05 18:43:45

序列使用map;映射使用merge-with

代码语言:javascript
复制
user=> (map #(% %2) converters-1 row-1)
("John" 24)
user=> (merge-with #(% %2) converters-2 row-2)
{:name "John", :age 24}
票数 4
EN

Stack Overflow用户

发布于 2014-07-04 19:08:56

代码语言:javascript
复制
(map #(%1 %2) converters-1 row-1)
;; ("John" 24)

如果是(def row-2 {:name "John", :age "24"}) (在您的示例中是一个整数)

代码语言:javascript
复制
(for [x (keys converters-2)] ((converters-2 x) (row-2 x)))
;; ("John" 24)
票数 1
EN

Stack Overflow用户

发布于 2014-07-04 19:23:04

我为地图方法找到了一个解决方案,但它不如迭戈的矢量解决方案那么优雅。

代码语言:javascript
复制
(into {} (map (fn [[k v]] 
    [k  ((converters-2 k) v)]
) row-2))

这种地图方法有更简单的解决方案吗?我是不是缺少了一个可以简化它的核心功能?

编辑:阅读迭戈的编辑,我也可以使用keys

代码语言:javascript
复制
(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

代码语言:javascript
复制
(reduce #(update-in %1 [%2] (converters-2 %2)) row-2 (keys row-2))

嗯,现在它已经写好了,对我的新手来说,阅读和理解都变得更加困难了。

到目前为止,向量解仍然是最好的。我会睁大眼睛寻找一个更好的地图解决方案,总有一天它会派上用场的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24579405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档