首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理assoc入/入时的列表等

如何处理assoc入/入时的列表等
EN

Stack Overflow用户
提问于 2017-03-12 19:28:35
回答 2查看 106关注 0票数 1

我从一个csv文件开始。我已经使用了它,并添加了一些结构与partition-by和排序与sort-by。但是现在我想添加值来跟踪处理。但是get-inassoc-in不喜欢列表。虽然我还没有添加列表,但partition-by似乎很喜欢它们。

那么,如何摆脱这种局面呢?是否有一种方法可以将结构中的所有列表转换为向量或替代版本的partition-by,而这并不是对列表这么爱哭,还是我需要重新思考我的解决方案?:-)

结构的一个简单例子

代码语言:javascript
复制
(sort '(1 2 3 4 5))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-12 20:20:08

如果您想转换列表,然后使用关联接口,clojure.walk有实用程序,允许您在任意嵌套的结构上进行转换。

代码语言:javascript
复制
(let[my-nested-structure {:foo '(1 2 4) '(0) :bar :baz {42 '()}}]
  (clojure.walk/postwalk #(if (list? %) (vec %) %) my-nested-structure))
;; => {:foo [1 2 4], [0] :bar, :baz {42 []}}

在这个实例中,postwalkprewalk实际上是相同的,但是如果替换函数添加/删除子条目,则两者之间的区别可能很重要。

幽灵图书馆也可能让您感兴趣--它的transformselect等允许您从稍微不同的方向来处理get-in类型的作业,并且使用这种数据结构不可知论。

票数 1
EN

Stack Overflow用户

发布于 2017-03-12 19:54:09

如果您的结构是一个名为xs的列表,那么您可以:

代码语言:javascript
复制
(mapv vec xs)

这会给你一个矢量向量。向量是一个关联的数据结构(与列表不同),所以get-inassoc-in可以工作。但是,如果有比一个元素在向量中的位置更有意义的键,那么您可能更喜欢使用映射,在这种情况下,您将拥有一个同构映射的集合(向量或列表),这是处理数据的一种常见方式。

只是为了核实:

代码语言:javascript
复制
(mapv vec '((1 2 3) (4 5 6)))
;;=> [[1 2 3] [4 5 6]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42752056

复制
相关文章

相似问题

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