2013-03-14 2 views
3

Я пытаюсь вывести значения из сложной структуры списка.Вытягивание значений из сложных списков в Clojure

Учитывая то вроде этого:

[{:a "whatever" :b [:c "foo"]} :e {:f "boo"} :g {:h [:i 62281]}] 

Я хотел бы получить:

["whatever" "foo" "boo" 62281] 

До сих пор я только добрался до этой точки:

((62281) nil (boo) nil whatever foo) 

Вот код:

(defn get-values [params] 
    (apply conj 
     (map (fn [part] 
       (if (not (keyword? part)) 
        (map (fn [v] 
          (if (vector? v) 
           (last v) 
           v)) 
         (vals part)))) 
       params))) 
  1. Я не могу избавиться от ноль-х
  2. Я не могу понять, почему значения после определенного момента в списках.
  3. Я полагаю, что это лучший способ сделать это.

ответ

5

Исправить структуру данных и все упадет на свои места. На данный момент ваша структура данных совсем несовместима, и это сделает любую функцию, которая будет касаться этих данных более сложной и подверженной ошибкам. Вы можете моделировать эти данные в виде карты:

(def data {:a "whatever" 
      :b nil 
      :c "foo" 
      :e nil 
      :f "boo" 
      :g nil 
      :h nil 
      :i 62281}) 

А затем, чтобы получить желаемый результат:

(->> (vals data) 
    (filter (comp not nil?)) 
    (into [])) 

Но по какой-то странной причине вы все еще хотите, чтобы проанализировать структуру данных, которую вы предоставили, то:

(defn get-values [data] 
    (->> (map #(if (map? %) (into [] %) %) data) 
     flatten 
     (filter #(or (string? %) (number? %))) 
     (into []))) 
+0

«Исправить данные» на самом деле не все, что полезно, так как вы не знаете контекста, но вторая часть выполняет эту работу, и я сам буду ее прорывать, чтобы точно видеть, что вы там делали. Благодарю. –

+0

Несомненно, но предоставленные вами данные не требовали его структуры. Никакой ключ не повторялся, никакое внутреннее сопоставление не содержало более одного ключа, и каждый вектор составлял 2 элемента, начинающихся с ключевого слова. Учитывая эти ограничения, неудобно представлять данные таким образом. Вместо того, чтобы пытаться проанализировать структуру данных, которую вы предоставили, я бы потратил свое время, пытаясь понять, почему у меня есть эта структура данных в первую очередь. – ToBeReplaced

+0

Мне хорошо известно, как выглядит структура данных и как она может быть разной/лучшей, но мой вопрос заключался в том, как можно было бы разобрать сложный список, независимо от того, как и почему у меня есть этот список. То, что вы говорите, сродни словам «Не входите в одного». когда парень спрашивает, как он может достать машину из канавы. Это очевидно, но не особенно полезно или образовательно. –

Смежные вопросы