2017-07-12 5 views
1

Ich bin ziemlich neu in Clojure, also bitte bitte mit mir. Ich habe mit dieser scheinbar einfachen Aufgabe, eine Karte von Karten für einige Stunden zu unterteilen, gekämpft, und ich bin ratlos.Subsetting einer Karte von Karten in clojure

Meine Eingabe ‚Typen‘ eine Sammlung von Strings und ‚in-Karte‘ hat die Form wie:

{2 {3.507276 [1 "Mp2H"], 14.4985235 [1 "MpHpNa"], 21.541099 [1 "MpHpNH4"], 22.4854915 [1 "MpHpK"], 24.020551 [1 "MpACNp2H"], 25.489771 [1 "Mp2Na"], 33.0231235 [1 "2Mp3H2Op2H"], 44.533826 [1 "Mp2ACNp2H"], 65.047101 [1 "Mp3ACNp2H"]}, 1 {6.007276 [1 "MpH"], 11.007276000000001 [1 "2MpH"], 23.033823 [1 "MpNH4"], 27.989771 [1 "MpNa"], 28.033823 [1 "2MpNH4"], 32.989771000000005 [1 "2MpNa"], 38.033489 [1 "MpCH3OHpH"], 43.963707 [1 "MpK"], 47.033826 [1 "MpACNpH"], 48.963707 [1 "2MpK"], 52.033826 [1 "2MpACNpH"], 69.016321 [1 "MpACNpNa"], 74.016321 [1 "2MpACNpNa"], 88.060376 [1 "Mp2ACNpH"]}, 3 {2.673942666666667 [1 "Mp3H"], 10.001440966666667 [1 "Mp2HpNa"], 17.328939336666668 [1 "Mp2NaH"], 17.328943366666667 [1 "MpHp2Na"], 24.65643766666667 [1 "Mp3Na"], 27.978229666666667 [1 "Mp2KpH"]}}  

Ich will Teilmenge ‚in-Karte‘ nur auf jene inneren Elemente, die die ‚Typen passen '

so dass, wenn unsere 'Typen' ["Mp2H" "MpH" "MpNH4" "Mp3H"] sind, wird es zurück: {2 {3.507276 [1 "Mp2H"]}, 1{6.007276 [1 "MpH"], 23.033823 [1 "MpNH4"]}, 3{2.673942666666667 [1 "Mp3H"]}}

Dies ist mein aktueller Versuch:

(map (fn [[id multiple-items]] 
    [id (->> multiple-items 
       (filter (fn [[_ single-type]] 
       (in? types (get single-type 1))) 
       ))] 
in-map)) 

Derzeit wird object[clojure.core$map$fn__4549 0x47257bf1 "[email protected]"] zurückgegeben. Ich hatte einen früheren Versuch, der aber das Format der Ausgabe der Teilmenge gearbeitet hat noch keinen Eingang übereinstimmen, die wie folgt aussieht:

(map (fn [[id multiple-items]] 
     [id (filter (fn [[_ single-type]] 
       (in? types (get mol-adduct 1))) 
        multiple-items)]) 
in-map)) 

Das gibt:

([2 ([3.507276 [1 "Mp2H"]])] [1 ([6.007276 [1 "MpH"]] [23.033823 [1 "MpNH4"]])] [3 ([2.673942666666667 [1 "Mp3H"]])]) 

Welche ist nicht das gleiche Format wie die Eingang.

Vielen Dank für jede Hilfe!

Antwort

1

Ich konnte es mit etwas extra Google Fu herausfinden und herumspielen! Die Lösung:

(into {} 
    (map (fn [[id multiple-items]] 
    [id (into {} 
      (filter (fn [[_ single-type]] 
        (in? types (get mol-adduct 1))) 
      multiple-items))]) 
    in-map)) 
Verwandte Themen