Graph 嵌套映射到表示Clojure中边的元组序列

Graph 嵌套映射到表示Clojure中边的元组序列,graph,clojure,tree,traversal,Graph,Clojure,Tree,Traversal,如何用惯用的Clojure表达以下转换 (def m {:a {:b {:c nil :d nil}} :e nil}}) (map->edges m) ; => ([:a :b] [:b :c] [:b :d] [:e nil] [:d nil] [:a :e] [:e nil]) 我不关心向量在结果中的显示顺序,因此深度优先或呼吸优先搜索策略都是不错的。您可以使用和非常简洁地表达这一点: 例如: (map->

如何用惯用的Clojure表达以下转换

(def m
     {:a {:b {:c nil
              :d nil}}
          :e nil}})


(map->edges m) ; =>


([:a :b] [:b :c] [:b :d] [:e nil] [:d nil] [:a :e] [:e nil])

我不关心向量在结果中的显示顺序,因此深度优先或呼吸优先搜索策略都是不错的。

您可以使用和非常简洁地表达这一点:

例如:

(map->edges m)
;;=> ([:a :b] [:a :e] [:b :c] [:b :d] [:c nil] [:d nil] [:e nil])

FWIW输入格式并不是一种很好的图形表示方式,因为它不清楚循环是如何工作的。更典型的是类似于邻接贴图的东西,其中键是节点,值是节点集。对于图形,它看起来像
{a#{b e},b#{c d}}
,可选地为c/d/e设置空集以指示没有传出边的节点。理想情况下,我会说修复输入格式,这样您就不必执行此步骤,但如果您无法控制它,则此问题的答案是对其进行后期处理的合理方式。
(map->edges m)
;;=> ([:a :b] [:a :e] [:b :c] [:b :d] [:c nil] [:d nil] [:e nil])