首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Clojure中的向量映射转换为列的向量

将Clojure中的向量映射转换为列的向量
EN

Stack Overflow用户
提问于 2015-04-25 19:36:11
回答 2查看 369关注 0票数 2

我有一个地图集合(或列表、序列或向量),如下所示:

代码语言:javascript
复制
{ :name "Bob", :data [32 11 180] }
{ :name "Joe", :data [ 4  8  30] }
{ :name "Sue", :data [10  9  40] }

我希望创建新的向量,包含与描述数据的键关联的向量“列”中的数据,如下所示:

代码语言:javascript
复制
{ :ages [32 4 10], :shoe-sizes [11 8 9], :weights [180 30 40] }

实际上,一份简单的向量清单可能是足够的,即:

代码语言:javascript
复制
[32 4 10] [11 8 9] [180 30 40]  

如果把原始列表变成向量更好/更容易,那就好了;任何最简单的东西都行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-25 20:22:55

给定的

代码语言:javascript
复制
(def records
  [{:name "Bob" :data [32 11 180]}
   {:name "Joe" :data [ 4  8  30]}
   {:name "Sue" :data [10  9  40]}])

您可以执行下一个转换以获得所需的结果:

代码语言:javascript
复制
(->> records
     (map :data) ; extract :data vectors 
     ; => ([32 11 180] [4 8 30] [10 9 40])
     (apply map vector) ; transpose
     ; => ([32 4 10] [11 8 9] [180 30 40])
     (zipmap [:ages :shoe-sizes :weights])) ; make map 
     ; => {:weights [180 30 40], :shoe-sizes [11 8 9], :ages [32 4 10]}

如果没有注释,它看起来会更干净一些:

代码语言:javascript
复制
(->> records 
     (map :data)
     (apply map vector)
     (zipmap [:ages :shoe-sizes :weights]))

如果没有穿线宏,它就相当于更详细:

代码语言:javascript
复制
(let [extracted (map :data records)
      transposed (apply map vector extracted)
      result (zipmap [:ages :shoe-sizes :weights] transposed)]
  result)
票数 4
EN

Stack Overflow用户

发布于 2015-04-25 20:12:12

您可以像这样使用减缩:

代码语言:javascript
复制
(def data [{ :name "Bob", :data [32 11 180] }
           { :name "Joe", :data [ 4  8  30] }
           { :name "Sue", :data [10  9  40] }])

(reduce 
  (fn [acc {[age shoe-size weight] :data}]
    (-> acc
      (update-in [:ages] conj age)
      (update-in [:shoe-sizes] conj shoe-size)
      (update-in [:weights] conj weight)))
{}
data)

返回如下内容:

代码语言:javascript
复制
{:weights (40 30 180), :shoe-sizes (9 8 11), :ages (10 4 32)}

我认为这段代码最有趣的部分是使用嵌套的析构来获取键:{[age shoe-size weight] :data}

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

https://stackoverflow.com/questions/29869802

复制
相关文章

相似问题

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