我从一个csv文件开始。我已经使用了它,并添加了一些结构与partition-by和排序与sort-by。但是现在我想添加值来跟踪处理。但是get-in和assoc-in不喜欢列表。虽然我还没有添加列表,但partition-by似乎很喜欢它们。
那么,如何摆脱这种局面呢?是否有一种方法可以将结构中的所有列表转换为向量或替代版本的partition-by,而这并不是对列表这么爱哭,还是我需要重新思考我的解决方案?:-)
结构的一个简单例子
(sort '(1 2 3 4 5))发布于 2017-03-12 20:20:08
如果您想转换列表,然后使用关联接口,clojure.walk有实用程序,允许您在任意嵌套的结构上进行转换。
(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 []}}在这个实例中,postwalk和prewalk实际上是相同的,但是如果替换函数添加/删除子条目,则两者之间的区别可能很重要。
幽灵图书馆也可能让您感兴趣--它的transform、select等允许您从稍微不同的方向来处理get-in类型的作业,并且使用这种数据结构不可知论。
发布于 2017-03-12 19:54:09
如果您的结构是一个名为xs的列表,那么您可以:
(mapv vec xs)这会给你一个矢量向量。向量是一个关联的数据结构(与列表不同),所以get-in和assoc-in可以工作。但是,如果有比一个元素在向量中的位置更有意义的键,那么您可能更喜欢使用映射,在这种情况下,您将拥有一个同构映射的集合(向量或列表),这是处理数据的一种常见方式。
只是为了核实:
(mapv vec '((1 2 3) (4 5 6)))
;;=> [[1 2 3] [4 5 6]]https://stackoverflow.com/questions/42752056
复制相似问题