【问题标题】:how to paritally flatten a list in clojure?如何部分展平clojure中的列表?
【发布时间】:2013-04-18 16:29:49
【问题描述】:

假设我有一个像这样的数据结构:

[[1 2 3] [4 5 6] [[7 8 9] [10 11 12]]]

而我最终想要的是:

[[1 2 3] [4 5 6] [7 8 9] [10 11 12]]

是否有任何功能可以自动执行此操作?

基本上,我正在将 SQL 结果集转换/转换为 CSV,并且有一些行将转换为 CSV 中的 2 行。所以我的 map 函数在正常情况下会返回一个向量,但有时会返回一个向量的向量。 Clojure.data.csv 只需要一个向量列表,所以我需要展平旋转的行。

【问题讨论】:

  • 我首选的解决方案是始终生成向量的向量;单行结果将是单例向量。无论您在执行额外的包装过程中损失了多少时间/ LOC,您都将能够更简单地处理数据以进行输出。此外,它感觉更干净,更坚固。只是我的 €.02。

标签: clojure


【解决方案1】:

Mapcat 对于每个元素可以扩展为 0 个或多个输出元素的映射很有用,如下所示:

(mapcat #(if (vector? (first %)) % [%]) data)

虽然我不确定(vector? (first %)) 是否足以测试您的数据。

【讨论】:

  • 不,结果应该产生一个由 4 个向量组成的向量,您的代码产生 3 个——您正在合并最后 2 行数据,而实际上它们应该是分开的。
  • 啊,是的。我懂了。给我一分钟
【解决方案2】:

使用树序列的不同方法:

(def a [[1 2 3] [4 5 6] [[7 8 9] [10 11 12]]])

(filter (comp not vector? first) 
   (tree-seq (comp vector? first) seq a))

我在这里使用tree-seq。是否有更好的方法只返回孩子而不是使用有效的过滤器(不是分支?)

【讨论】:

    【解决方案3】:

    Clojure: Semi-Flattening a nested Sequence 回答了您的问题,但我不想将此问题标记为与该问题重复,因为您实际上问的是与他不同的问题;我想知道是否可以将他的答案移到这里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多