developer tip

Clojure에서 목록 유형간에 쉽게 변환 할 수있는 방법이 있습니까?

copycodes 2020. 9. 11. 08:11
반응형

Clojure에서 목록 유형간에 쉽게 변환 할 수있는 방법이 있습니까?


벡터를 원할 때 lazy list를 사용하는 경우가 많으며 그 반대의 경우도 마찬가지입니다. 또한, 가끔은 맵 세트가 정말로 필요할 때 맵 벡터가 있습니다. 이러한 유형간에 변환하는 데 도움이되는 도우미 함수가 있습니까?


신뢰할 수있는 old intoseq가능한 모든 것 (list, vector, map, set, sorted-map)과 채우려는 빈 컨테이너를 가져 와서 넣을 수 있다는 것을 잊지 마십시오 into.

(into [] '(1 2 3 4)) ==> [1 2 3 4]         "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4}        "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2}    "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"

intoconj컬렉션 유형에 따라 컬렉션에 새 항목을 적절하게 삽입하기위한 기본 추상화 인 래퍼 입니다. 그래서 친절이 흐름을 만드는 원리는 Clojure의이 빌드에 있다는 것이다 작성 가능 추상화 ,이 경우에는 into위에 conj수집의 상단에 seq.

위의 예는 수신자가 런타임에 전달되는 경우 여전히 잘 구성됩니다. 기본 추상화 ( seqconj)가 모든 컬렉션 (및 많은 Java 컬렉션에도 적용됨)에 대해 구현되므로 더 높은 추상화는 걱정할 필요가 없습니다. 많은 특수 데이터 관련 코너 케이스에 대해.


vec, set그리고 일반적으로 into다른 컬렉션 유형으로 쉽게 "변환"할 수있는 친구입니다.

지도 벡터를지도지도로 어떻게 변환 하시겠습니까? 키가 필요합니다. 샘플 입력 / 예상 출력과 함께 사용할 수 있습니까?


벡터의 경우 vec기능이 있습니다.

user=> (vec '(1 2 3))
[1 2 3]

게으른 시퀀스의 경우 lazy-seq기능이 있습니다.

user=> (lazy-seq [1 2 3])
(1 2 3)

세트로 변환하는 set기능이 있습니다.

user=> (set [{:a :b, :c :d} {:a :b} {:a :b}])
#{{:a :b} {:a :b, :c :d}}

(완전성을 위해) 목록에서 맵으로 변환하는 것에 대한 또 다른 답변- 여기에서 :

(apply hash-map '(1 2 3 4))
;=>{1 2, 3 4}

벡터를 목록으로 변환하려면 for다음과 같이 를 사용할 수도 있습니다 .

=> (for [i [1 2 3 4]] i)
(1 2 3 4)

데이터를 조작하지 않으려면 seq벡터에서 사용 하십시오.

=> (seq [1 2 3])
(1 2 3)

벡터를 목록 으로 변환 할 필요가 없습니다 . Clojure는 시퀀스가 ​​필요할 때 목록을 시퀀스로 처리하는 것처럼 벡터를 처리합니다. 예를 들면

user=> (cons 0 [1 2 3])
(0 1 2 3)

If you need to make sure that the vector is being treated as a sequence, wrap it in seq:

user=> (conj [1 2 3] 0) ; treated as a vector
[1 2 3 0]

user=> (conj (seq [1 2 3]) 0) ; treated as a sequence
(0 1 2 3)

If you have a vector of maps, and you want a set of maps, it doesn't matter that the vector holds maps. You just convert the vector to a set as usual:

user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}])
#{{:a 1, :b 2} {"four" 4, "three" 3}}

참고URL : https://stackoverflow.com/questions/5088803/in-clojure-is-there-an-easy-way-to-convert-between-list-types

반응형