【问题标题】:How to convert list of hashmaps into one hasmap in clojure?如何在clojure中将hashmap列表转换为一个hashmap?
【发布时间】:2014-04-19 10:41:00
【问题描述】:

我有一个如下所示的列表:

({:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10})

我想把它转换成 hashmap:

{:2 9 :5 8 :6 10}

列表是从mysql数据库创建的,我不知道我能不能从数据库中获取其他格式的数据,这样更容易转换成一个hashmap,我使用了java.jdbc查询函数。

谁能帮帮我?

【问题讨论】:

    标签: list clojure hashmap


    【解决方案1】:
    (fn [data] (into {} (map (juxt :course :mark) data)))
    

    (list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10})
    

    生产

    {2 9, 5 8, 6 10}
    

    keyword 函数不接受数字作为参数,所以我不认为你能得到你想要的东西。但无论如何,数字和关键字一样好。


    错了!正如其他人所展示的,Clojure 接受数字 strings 作为关键字。我们可以调整以上内容以使用这样的:

    (fn [data] (into {} (map (juxt (comp keyword str :course) :mark) data)))
    

    (list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10})
    

    生产

    {:2 9, :5 8, :6 10}
    

    但是,正如我所说,我认为这是不必要的冒险。为什么不直接使用数字作为键呢?


    进一步使用数字(字符串)作为关键字:

    reader doc about symbols

    • 符号以非数字字符开头...
    • 关键字类似于符号,除了:...(进一步受限)

    【讨论】:

    • juxt 在这里是个好主意!为了练习,这里是获得确切请求输出的解决方案:(fn [data] (into {} (map (juxt #(keyword (str (:course %))) :mark) data)))
    • @leontalbot 我的做法略有不同,Leon。我仍然对接受数字字符串关键字感到惊讶。不管怎样,带有关键字即函数的juxt 非常具有表现力。另一种表达内在功能的方式是#(-> % :course str keyword),如果你在打代码高尔夫:仍然是一个比我长的角色,呵呵。
    【解决方案2】:

    另一个变种。 (如果您有大量数据,可能效率低于缩略图。)

    (zipmap (map (comp keyword str :course)  data)
            (map :mark data))
    

    data 采用问题中指定的格式。

    【讨论】:

    • ... 或 (apply zipmap (map #(map % data) [(comp keyword str :course) :mark]))
    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2014-07-20
    • 2020-01-05
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多