如何在关联/加入等时处理列表

时间:2017-03-12 19:28:36

标签: clojure

我开始使用csv文件。我啜饮了它并添加了>>> import math >>> eval('math.pi * 2') 6.283185307179586 的一些结构并用partition-by排序。但现在我想添加值以跟踪处理。但sort-byget-in不喜欢列表。虽然我没有添加列表,assoc-in似乎喜欢它们。

那么,如何摆脱这种局面呢?有没有办法将结构中的所有列表转换为向量或partition-by的替代版本,这不是关于列表的爱马仕或我是否需要以某种方式重新考虑我的解决方案? : - )

结构的简单示例

partition-by

2 个答案:

答案 0 :(得分:1)

如果要转换列表然后使用关联接口,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 []}}
在此实例中,

postwalkprewalk实际上是相同的,但如果您的替换函数添加/删除子条目,则差异可能很重要。

specter library可能也会让您感兴趣 - transformselect等允许您从稍微不同的方向和该数据结构处理get-in类型的作业不可知论。

答案 1 :(得分:0)

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

(mapv vec xs)

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

仅供验证:

(mapv vec '((1 2 3) (4 5 6)))
;;=> [[1 2 3] [4 5 6]]