Это мои входные данные:
[[:a 1 2] [:a 3 4] [:a 5 6] [:b \a \b] [:b \c \d] [:b \e \f]]
Я хотел бы отобразить это следующим образом:
{:a [[1 2] [3 4] [5 6]] :b [[\a \b] [\c \d] [\e \f]]}
Это то, что у меня есть до сих пор:
(defn- build-annotation-map [annotation & m]
(let [gff (first annotation)
remaining (rest annotation)
seqname (first gff)
current {seqname [(nth gff 3) (nth gff 4)]}]
(if (not (seq remaining))
m
(let [new-m (merge-maps current m)]
(apply build-annotation-map remaining new-m)))))
(defn- merge-maps [m & ms]
(apply merge-with conj
(when (first ms)
(reduce conj ;this is to avoid [1 2 [3 4 ... etc.
(map (fn [k] {k []}) (keys m))))
m ms))
Выше приведено:
{:a [[1 2] [[3 4] [5 6]]] :b [[\a \b] [[\c \d] [\e \f]]]}
Мне кажется, что проблема в merge-maps
, в частности, в функции, переданной в merge-with
(conj
), но после стука моегоПодожди немного, я уже готов к тому, что кто-то мне поможет.
Я новичок в lisp в целом и clojure в частности, поэтому я также ценю комментарии, не относящиеся конкретно к проблеме, нотакже стиль, умопомрачительные конструкции с моей стороны и т. д. Спасибо!
Решение (достаточно близко, во всяком случае):
(group-by first [[:a 1 2] [:a 3 4] [:a 5 6] [:b \a \b] [:b \c \d] [:b \e \f]])
=> {:a [[:a 1 2] [:a 3 4] [:a 5 6]], :b [[:b \a \b] [:b \c \d] [:b \e \f]]}