【问题标题】:Default value for a nested map in clojureclojure 中嵌套映射的默认值
【发布时间】:2015-04-28 07:26:34
【问题描述】:

我研究 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}
            }

【问题讨论】:

    标签: clojure functional-programming


    【解决方案1】:

    通过阅读您的示例,很难准确判断您何时希望包含默认值,尽管有一种非常常见的模式是提供一组默认值并将输入合并到其中,以便在给出值的任何地方使用它,如果它不存在用于特定键的默认值:

    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}}
    

    【讨论】:

    • 是的,这正是我想要的。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多