[英]Default value for a nested map in clojure
我已經研究Clojure已有一段時間了,但是我找不到能為嵌套地圖提供默認值的函數。 例如,如果我有如下地圖,
(def paths {:A {:B 5, :D 5, :E 7},
:B {:C 4},
:C {:D 8, :E 2},
:D {:C 8, :E 6},
:E {:B 3}
})
我想要一個函數,根據給定的哈希映射,如下創建映射,
{:A {:B 5, :C default_val :D 5, :E 7},
:B {:A default_val, :C 4, :D default_val, :E default_val},
:C {:A default_val, :B default_val, :C default_val, :D 8, :E 2},
:D {:A default_val, :B default_val, :C 8, :D default_val, :E 6},
:E {:A default_val, :B 3, :C 8, :D default_val, :E 3}
}
通過閱讀示例,很難確切地知道何時要包含默認值,盡管存在一種非常常見的模式,即提供一組默認值並將輸入合並到其中,以便無論在何處使用該值,以及是否使用該值對於特定鍵,使用默認值:
user> (def default-values {:A :default :B :default :C :default :D :default})
#'user/default-values
user> (def paths {:A {:B 5, :D 5, :E 7},
:B {:C 4},
:C {:D 8, :E 2},
:D {:C 8, :E 6},
:E {:B 3}})
#'user/paths
user> (keys paths)
(:A :D :B :C :E)
user> (vals paths)
({:D 5, :B 5, :E 7} {:C 8, :E 6} {:C 4} {:D 8, :E 2} {:B 3})
user> (map #(merge default-values %) (vals paths))
({:A :default, :D 5, :B 5, :C :default, :E 7}
{:A :default, :D :default, :B :default, :C 8, :E 6}
{:A :default, :D :default, :B :default, :C 4}
{:A :default, :D 8, :B :default, :C :default, :E 2}
{:A :default, :D :default, :B 3, :C :default})
user> (clojure.pprint/pprint
(zipmap (keys paths)
(map #(merge default-values %)
(vals paths))))
{:E {:A :default, :D :default, :B 3, :C :default},
:C {:A :default, :D 8, :B :default, :C :default, :E 2},
:B {:A :default, :D :default, :B :default, :C 4},
:D {:A :default, :D :default, :B :default, :C 8, :E 6},
:A {:A :default, :D 5, :B 5, :C :default, :E 7}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.