10180


キーと値のリストからマップを作りたいです。

[code]

    ((:a 1) (:b 2))
    
[/code]

このリストをマップにしたい。

[code]

    {:a 1, :b 2}
    
[/code]

以下のようにして結果は得られたのですが、もっとこう簡単に、またClojureらしい方法があるのではないかと思いました。

[code]

    (apply merge (map #(apply assoc {} %) '((:a 1) (:b 2))))
    
[/code]

よりよい方法があれば教えてください。

よりよいと考える理由も教えてください。

僕の方法がよくないのではないかと考える理由は効率です。リストの要素ごとにキーひとつだけのマップをまず作り、それからひとつのマップにまとめています。


CC BY-SA 3.0
2015-05-14T11:27:38.600
10179
2015-05-14T12:57:27.293
2015-05-14T12:24:10.263
9731
9731
question
clojure
Clojureでリストからマップを作るには


`(into {} (for [[k v] '((:a 1) (:b 2))][k v]))`

とか？


CC BY-SA 3.0
2015-05-14T11:52:47.513
10180
2015-05-14T11:52:47.513
5044
10179
answer


最初から元の連想リストをリストではなくベクタを要素にして作っておくのがいいんじゃないでしょうか。直接intoで扱えますから

[code]

    (into {} '([:a 1] [:b 2]))
    
[/code]

連想リストはClojureではあまり使わない気がします。

質問にあるコードはreduceを使えば改善できます(intoも中身はreduceです)

[code]

    (reduce #(apply assoc %1 %2) {} '((:a 1) (:b 2)))
    
[/code]


CC BY-SA 3.0
2015-05-14T12:57:27.293
10183
2015-05-14T12:57:27.293
9464
10179
answer