2016-09-30 2 views
0

У меня есть карта в видеУдаление ключей из карты с помощью Clojure

({:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0}) 

Я просто хочу только значения должны быть возвращены, но не keys.I попытался с помощью vals функцию, но используется только если он имеет вид {:A 1.0, :B 2.0}.

Также попытался использовать for цикл, а затем использовать функцию peek. Но я получаю nil, когда я использую функцию peek, так как первым элементом здесь является карта.

Я хочу вернуть это: {[1.0 2.0][3.0 1.0][3.0 1.0][4.0 1.0][12.0 2.0][3.0 1.0]}.

ответ

4

У вас есть список карт здесь. Чтобы получить vals вы можете map это

user=> (map vals '({:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0})) 
((1.0 2.0) (3.0 1.0) (4.0 1.0) (12.0 2.0) (3.0 1.0)) 

Также обратите внимание, что карты не упорядочены (они появляются заказаны для небольших наборов ключей). Так что если вы хотите, чтобы убедиться, что вы получите значения для :A, а затем :B вы можете использовать juxt и ключи вы хотите:

user=> (map (juxt :A :B) '({:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0})) 
([1.0 2.0] [3.0 1.0] [4.0 1.0] [12.0 2.0] [3.0 1.0]) 
+0

Ох, нет! Я даже использовал функцию juxt, но я не получил. Благодарю за это! – joey

0

Необходимо уточнить свой вопрос. Ваш вход не является картой, это последовательность карт. Вы хотите получить результат, который представляет собой последовательность векторов.

Напишите их оба с использованием векторной нотации (vec карт, vec of vecs). Обратите внимание, что у вас также была ошибка в предложенном вами ответе, который я исправил!

(ns tst.clj.core 
    (:use clj.core 
     clojure.test)) 

(def vec-of-maps [ {:A 1.0, :B 2.0} {:A 3.0, :B 1.0} {:A 4.0, :B 1.0} {:A 12.0, :B 2.0} {:A 3.0, :B 1.0} ]) 

(def answer  [ [1.0 2.0]   [3.0 1.0]   [4.0 1.0]   [12.0 2.0]  [3.0 1.0] ]) 

(defn ff 
    [data] 
    (forv [curr-map data] 
    (vec (vals curr-map)))) 

(deftest tt 
    (is (= answer (ff vec-of-maps)))) 

Обратите внимание, что, если мы заботимся только о равенстве, нам действительно не нужно принудительно приводить результат в векторы. Мы могли бы использовать f2 ниже и получить последовательность последовательностей в качестве вывода, который равен VEC из ЗВТ:

(defn f2 
    [data] 
    (for [curr-map data] 
    (vals curr-map))) 
+2

Можете ли вы ответить на вопросы, не используя ваши библиотеки в каждом ответе? Это против духа SO и может ввести в заблуждение для начинающих. – ClojureMostly

+0

Он не использовался в этом ответе, просто декларация с левым верхним пределом. –

3

Я хочу вернуть это:

{[1.0 2.0][3.0 1.0][3.0 1.0][4.0 1.0][12.0 2.0][3.0 1.0]}.

Нет, вы этого не сделаете! Вы хотите вернуть

[[1.0 2.0][3.0 1.0][3.0 1.0][4.0 1.0][12.0 2.0][3.0 1.0]] 

или эквивалентные списки.

Если мы имеем

(DEF данных [{: 1,0,: B 2,0} {: 3,0,: B 1,0} {: а 4.0: В 1,0} {: 12,0,: B 2,0} {: 3,0,: B 1,0}])

затем

(map vals data) 
;((1.0 2.0) (3.0 1.0) (4.0 1.0) (12.0 2.0) (3.0 1.0)) 

Как отмечает Alan Thompson, это решение не отвечает, так как он не гарантирует порядок каждого суб-списка ,

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