Clojure - нарезать 2D вектор векторно - PullRequest
1 голос
/ 10 января 2020

У меня есть двумерный вектор, который выглядит следующим образом

 (["2011-01-01" "2011" "01" "01"]
 ["1869-01-01" "1869" "01" "01"]
 ["1922-01-01" "1922" "01" "01"]
 ["1905-01-01" "1905" "01" "01"])

Я хочу иметь только вектор только из второго столбца, поэтому он будет выглядеть следующим образом

("2011" "1869" "1922" "1905")

Что такое лучший способ сделать это в Clojure?

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Обязательно проконсультируйтесь с Clojure CheatSheet для подобных вопросов.

Для чего-то такого простого, просто используйте mapv (или map) и функцию second :

(def data [["2011-01-01" "2011" "01" "01"]
           ["1869-01-01" "1869" "01" "01"]
           ["1922-01-01" "1922" "01" "01"]
           ["1905-01-01" "1905" "01" "01"]])

(mapv second data) => ["2011" "1869" "1922" "1905"]

Я предпочитаю mapv, поскольку он дает результат в виде вектора (не ленивый), который легче вырезать и вставить без нужных кавычек.


Если у вас есть более сложные потребности, вы можете sh просмотреть библиотеку tupelo.array . Ваши данные уже представлены в виде двумерного массива Clojure (вектор векторов), поэтому вы можете просто использовать функцию col-get:

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [tupelo.array :as ta]))

(def data ...)

; Note zero-based indexing
(ta/col-get data 1) => ["2011" "1869" "1922" "1905"]

Библиотека включает в себя множество других функций для ввода / вывода , получить / установить значения, перевернуть массивы вверх / вниз или влево / вправо, вращение, добавление / удаление строк и столбцов и т. д. c. Существует также версия, которая работает с изменяемыми массивами (Java массивами собственных объектов) вместо неизменяемых структур данных Clojure.

1 голос
/ 10 января 2020

Возможные ответы

A. (reduce (fn [| [_ - ]] (conj | -)) [] data)

B. (map (fn [[_ - ]] -) data)

C. (map second data)

...