2009-06-02 2 views
32

, 나는 각 구조 별 서열이 항목을 제거하는 다른 방법 것 가정 벡터는 인덱스가 될 수 목록을 제거 될 수있다, 첫 번째 또는 마지막 설정 제거하기 위해 실제 항목의 통과해야 등등.Clojure에서 시퀀스에서 항목을 제거하려면 어떻게해야합니까? 먼저

둘째로, 나는 구조상 무신론자 인 제거를위한 몇몇 방법이다는 것을 추측한다; 그들은 seq 인터페이스에서 작동합니다.

Clojure에서 시퀀스가 ​​변경되지 않으므로 원본 항목이없는 경우에만 원본의 값싼 복사본을 만드는 것이 실제로 수행 한 것으로 판단됩니다. 이것은 목록 이해력이 제거에 사용될 수 있음을 의미하지만 불필요하게 자세한 정보가 될 것으로 생각됩니다.

Clojure 시퀀스에서 항목을 제거하는 여러 가지 방법에 대한 관용적 인 예를 제공하십시오.

답변

41

다른 성능 특성 때문에 Clojure의 모든 데이터 구조 유형에서 항목을 제거하기위한 단일 인터페이스가 없습니다.

(disj #{:foo :bar} :foo)  ; => #{:bar} 
(dissoc {:foo 1 :bar 2} :foo) ; => {:bar 2} 
(pop [:bar :foo])    ; => [:bar] 
(pop (list :foo :bar))   ; => (:bar) 

이들은 또한 (A seq 반환) 작동 : 당신이지도를 반복 할 때, 당신은 키/값 쌍을 얻을 수 있기 때문 해시 ​​맵이 작동하지 않습니다

(remove #{:foo} #{:foo :bar})  ; => (:bar) 
(remove #{:foo} [:foo :bar])  ; => (:bar) 
(remove #{:foo} (list :foo :bar)) ; => (:bar) 

. 하지만이 작품은 :

(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2}) ; => ([:bar 2]) 
+0

감사합니다. Brian,이게 내가 찾고있는 것입니다. Subvec에 대한 언급이 문서와 일치하지 않는 것 같습니다 : "시작에서 끝까지 배타적 인 벡터 항목의 영구 벡터를 반환합니다. 끝이 제공되지 않으면 기본값은 (카운트 벡터)입니다." "제거 된"항목을 제외하기 위해 두 가지 subvec 호출을 연결할 수 있다는 의미입니까? – rcampbell

+0

그래, 그게 내가 의미했던거야. 뒤늦은 시야에서 고려하기에는 너무 어색 할 수도 있습니다. 나는 그것을 포스트에서 제거 할 것이다. –

+0

['subvec'] (http://clojuredocs.org/clojure_core/clojure.core/subvec)는 O (1) 시간에 작동하기 때문에 (벡터의 경우) 언급 할만한 가치가 있습니다. –

2

브라이언 카퍼의 대답의 연장. 그것은 당신이 결과로 무엇을 할 것인가에 달려 있습니다. 결과를 전체 데이터 집합 (예 : 인쇄)에 적용하고자하는 결과에 전달하는 경우 seq를 만들고 필터를 사용하거나 문제를 느리게 해결하기 위해 제거하는 것은 관용적입니다. 반면에 데이터 구조를 수정하여 이후의 다양한 용도로 저장하면 seq를 작성하면 유리한 업데이트 특성이 느슨해 지므로이 경우 해당 데이터 구조에 특정한 업데이트 기능을 사용하는 것이 좋습니다.

관련 문제