通过clojure将地图列表缩减为列表

ped*_*eis 3 clojure

几个星期前我开始学习一些函数式编程,我正在尝试从一个映射列表到一个列表中的映射,考虑到clojure中的特定键.

我的地图列表如下: '({:a "a1" :b "b1" :c "c1"} {:a "a2" :b "b2" :c "c2"} {:a "a3" :b "b3" :c "c3"})

我想要的输出是:'("b1" "b2" "b3").

我尝试过以下方法:

(doseq [m maps]
  (println (list (get m :b))))
Run Code Online (Sandbox Code Playgroud)

我的输出是一个列表列表(我正在为每次迭代创建一个列表,这是预期的).所以我的问题是,如何将其减少到一个列表?

更新

刚试过以下内容:

(let [x '()]
  (doseq [m map]
    (conj x (get m :b))))
Run Code Online (Sandbox Code Playgroud)

但是,它仍然无法正常工作.我没有得到重点,因为我期望将元素附加到空列表中

Art*_*ldt 7

这是生产Clojure代码中非常常见的模式,因此它是一个学习的好地方.一般情况下,请查看https://clojure.org/reference/sequences上关于序列的文档,当遇到类似的任务时,请查看哪个模式最适合并探索该组中的函数.在这种情况下,它是"处理seq的每个项目以创建新的seq",列出的第一个项目是map

你的例子可能看起来像

 (map :b my-data)
Run Code Online (Sandbox Code Playgroud)

  • 这非常简单的函数式编程,解决方案非常简单......但是,对于那些使用非函数式编程的人来说,尝试使事情过于复杂(比如尝试迭代集合).谢谢 (4认同)