2017-11-16 1 views
2

시퀀스를 필터링하고 평가 된 pred 값을 유지하는 방법은 무엇입니까?

한다고 가정 하나는 서열을 필터링하는 자체 정의 self-pred 기능을 사용하고 싶습니다 내가 여러 번 발생, 아직에 대한 관용적 인 접근 방법을 찾지 못했습니다 시나리오는 ...입니다. 이 self-pred 함수는 원하지 않는 요소에 대해 nil을 반환하고 원하는 요소에 유용한 정보를 반환합니다. 이러한 원하는 요소에 대한 값은 self-pred으로 유지하는 것이 바람직합니다.

내 일반적인 솔루션은 다음과 같습니다

;; self-pred is a pred function which returns valuable info 
;; in general, they are unique and can be used as key 
(let [new-seq (filter self-pred aseq)] 
    (zipmap (map self-pred new-seq) new-seq)) 

기본적으로, 모든 요소를 ​​원 두 번 self-pred를 호출하는 것입니다. 나는 그것이 매우 못생긴다고 느낀다 ...

더 좋은 방법이 있는지 궁금하다. 모든 입력에 대해 많은 것을 알고 있습니다!

답변

4

내가 조각 이런 종류의 사용 예를 들어

user> (keep #(some->> % rseq (vector %)) [[1 2] [] [3 4]]) 
;;=> ([[1 2] (2 1)] [[3 4] (4 3)]) 

가하거나 더 자세한 결과를 원한다면 :

user> (keep #(some->> % rseq (hash-map :data % :result)) [[1 2] [] [3 4]]) 
;;=> ({:result (2 1), :data [1 2]} {:result (4 3), :data [3 4]}) 
5

이 시나리오에서는 keep을 사용할 수 있지만 각 항목에 대해 필요한 전체 정보 또는 nil을 반환하려면 "조건부"함수를 변경해야합니다. 이 같은

(keep #(some->> % self-pred (vector %)) data) 

:

(keep (fn [item] 
     (when-let [tested (some-test item)] 
      (assoc item :test-output tested))) aseq) 
1

나는 keep 신경 쓰지 것이지만, 단지 & 필터과 같이 일반지도를 사용합니다 : 결과에

(def data (range 6)) 

(def my-pred odd?) 

(defn zip [& colls] (apply map vector colls)) ; like Python zip 
(defn filter-with-pred 
    [vals pred] 
    (filter #(first %) 
    (zip (map pred vals) vals))) 

(println (filter-with-pred data my-pred)) 

:

([true 1] [true 3] [true 5]) 
-1

자기 PRED 보장 다른 없음 중복 키 생성하면 값을 줄이면 (동일한 키가 두 번 다시 원래 키 값 쌍보다 우선 적용됩니다.)

,515,

그렇지 우리가 유사한 결과를 구동 그룹별로 사용할 수

(dissoc (group-by self-pred aseq) nil) 

아니지만 값을 벡터로되기 때문에 동일한 {(K1) [V1 .., K2 [...], .. }. 그러나 이것은 모든 값이 유지된다는 것을 보장합니다.

+0

여기에 대해 조금 설명하고 질문에서 코드를 대체하는 방법을 설명해 주시겠습니까? – biagidp

관련 문제