Was würde ich tun, ist die resultierende Datenstruktur zu überdenken: Ich weiß nicht, wie würden Sie möglicherweise die resultierende Sammlung verwenden, aber die Benennung Schlüssel :sizeonX
, vor allem, wenn es potenziell variable Menge der registrierten Daten oder einige von ihnen fehlen vielleicht (wie zum Beispiel, wenn Sie Termine 1
und 3
für den ersten Weg haben, und 1
2
3
5
für die zweite) führt zu einem Durcheinander von unvorhersehbar benannten Schlüsseln in resultierenden Karten, die es Art und Weise machen würde schwieriger, wenn es darum geht, diese Schlüssel abzurufen. ich es sieht so aus, dass es besser wäre, diese Struktur zu verwenden:
{:path "first" :sizes {"1" "500" "2" "1g" "10" "222"}}
so Größen dieser Karte leicht iterativ und verarbeitet wird.
das ist, wie würde ich das tun:
(def data '({:path "first" :size "1 gb" :date "1"}
{:path "first" :size "0.9 gb" :date "3"}
{:path "second" :size "500 mb" :date "1"}
{:path "second" :size "700 mb" :date "2"}
{:path "second" :size "400 mb" :date "3"}
{:path "second" :size "900 mb" :date "5"}))
(map (fn [[k v]] {:path k
:sizes (into {} (map (juxt :date :size) v))})
(group-by :path data))
;; ({:path "first", :sizes {"1" "1 gb", "3" "0.9 gb"}}
;; {:path "second", :sizes {"1" "500 mb",
;; "2" "700 mb",
;; "3" "400 mb",
;; "5" "900 mb"}})
Update
aber wie Sie noch die Struktur von der Frage brauchen, ich es so tun würde:
(map (fn [[k v]]
(into {:path k}
(map #(vector (keyword (str "sizeon" (:date %)))
(:size %))
v)))
(group-by :path data))
;;({:path "first", :sizeon1 "1 gb", :sizeon3 "0.9 gb"}
;; {:path "second",
;; :sizeon1 "500 mb", :sizeon2 "700 mb",
;; :sizeon3 "400 mb", :sizeon5 "900 mb"})
das ist im Grunde ähnlich zu @superkonduktr Variante.
in Ihrem Beispiel brauchen Sie nicht wirklich erste Liste, weil es Daten in der zweiten dupliziert ist. Ist es immer wahr, oder gibt es Fälle, wo ein Pfadwert in der ersten Liste vorhanden ist und in der zweiten nicht vorhanden ist oder umgekehrt? Wenn ja, was ist das erwartete Ergebnis für diese Fälle? – leetwinski
ja das ist immer wahr. Ich brauche nur eine neue Liste mit dem gewünschten Ergebnis aus der zweiten Liste. Die zweite Liste ist nach Datum sortiert ... alle Einträge mit Datum "1" zuerst, dann "2" usw. (bearbeitet) .. Wie kann es gemacht werden? Kannst du bitte Superkondustrs Antwort sehen und meinen Kommentar beantworten? – user3083633