2017-02-03 1 views
4

나는 목록을 가지고 있으므로 컬렉션의 각 목록에 "reduce +"를 적용하고 싶습니다. 나는 "적용", "지도"및 "축소 +"를 결합해야한다고 생각하지만, 어떻게 이해할 수는 없습니다. 예 : [[1 2 3] [4 5 3] [2 5 1]] => [6 12 8]연속열의 각 요소에 대한 감소 적용

답변

4

apply은 필요하지 않습니다. mapreduce는 잘 작동합니다 :

(map (partial reduce +) [[1 2 3] [4 5 3] [2 5 1]]) 

map 각 목록의 구성원과 partial에있는 함수를 호출합니다 단순히 하나 개의 매개 변수를 기대 감소의 '카레'버전을 만듭니다. 또한 당신이 실제로뿐만 아니라 (그냥 모두) 여기 감소의 장소에 적용 사용할 수 #(reduce + %) 또는 (fn [lst] (reduce + lst))

업데이트

과 같이 작성할 수 있습니다 :

(map (partial apply +) [[1 2 3] [4 5 3] [2 5 1]]) 

또한 업데이트

성능 문제가있는 경우 @AlexMiller의 유용한 팁에 대한이 답변의 의견을 참조하십시오.

+1

이 두 가지 사이에서'reduce'가 더 좋으며 특히 하위 벡터가 큰 경우에 더 빠릅니다. –

+0

@AlexMiller 그 권장 사항에 동의하지 않습니다. 순간에'apply +'는'reduce +'에 위임합니다. 그래서 속도 차이는 특히 큰 벡터에 대해서는 무시할 수 있습니다. http://stackoverflow.com/a/3153643/625403에서 말한 것처럼,'apply'는 항상'reduce'에 위임 할 수있는 옵션을 가지고 있습니다 만, 줄일 수없는 몇 가지 특별한 최적화를 사용할 수 있습니다; 그 반대는 사실이 아니다. – amalloy

+0

나는이 답안에서'apply +'를'reduce +'와 비교하는 것에 대해 이야기했다. 일반적인 경우는 아니지만 (대부분의 경우 reduce는 적용하는 것보다 명확하고 빠르다고 생각한다). 언급 한대로 여기에 오버 헤드가 적용됩니다. https://gist.github.com/puredanger/88d0491cbb4dbf8fe98b3747963d0068 –

관련 문제