The solution proposed by @cgrant is great, but implicitly describes a tree where all branches and leaf nodes have an associated value (the key in the dictionary) except for the root node that is just a branch without a value. So, the tree {"/" nil}, is not a tree with a single leaf node, but a tree with an anonymous root branch and a single leaf node with value /. In practice, this means that every traversal of the tree has to first execute a (zip/down t) in order to descend the root node.
An alternative solution is to explicitly model the root inside the map, that is, only create zippers from maps with a single key at the root. For example: {"/" {"etc/" {"hosts" nil}}}
The zipper can then be implemented with:
(defn map-zipper [map-or-pair] "Define a zipper data-structure to navigate trees represented as nested dictionaries." (if (or (and (map? map-or-pair) (= 1 (count map-or-pair))) (and (= 2 (count map-or-pair)))) (let [pair (if (map? map-or-pair) (first (seq map-or-pair)) map-or-pair)] (zip/zipper (fn [x] (map? (nth x 1))) (fn [x] (seq (nth x 1))) (fn [x children] (assoc x 1 (into {} children))) pair)) (throw (Exception. "Input must be a map with a single root node or a pair."))))