2012-09-20 14 views
7

संभव डुप्लिकेट केवल truthy मूल्यों की गिनती:
how to return only truthy values as the result of a map operationएक संग्रह में

मैं एक संग्रह जो falsy और truthy मान हैं की है। मैं केवल सच्चे मूल्यों को गिनना चाहता हूं, क्या ऐसा करने का कोई तरीका है?

(गणना (1 2 3 शून्य शून्य)) => 5

+2

नहीं एक डुप्लिकेट - गिनती मूल्य बनाम उन्हें वापस करना एक अलग ऑपरेशन है (और इसमें कुछ अलग-अलग समाधान हैं) – mikera

उत्तर

19

आप truthy मान रखने के लिए चाहते हैं, बस identity फ़ंक्शन का उपयोग करना।

+1

यह उत्तर अच्छा है! – murtaza52

3

बस मान गिनती करने के लिए नहीं करना चाहते हैं हटा दें। हालांकि मैं मैं दानी के समाधान बेहतर पसंद स्वीकार

(count (filter identity '(1 2 3 nil nil false true))) 
+1

मामूली बग: (गिनती (शून्य हटाएं? [1 2 3 शून्य शून्य झूठा]) => 4 –

+0

आप 'nil?' को '# (यदि% झूठी सच)' –

+2

# (यदि% झूठी सत्य) के साथ बदलकर इसे ठीक कर सकते हैं तो फ़ंक्शन के बराबर नहीं है । (गिनें (हटाएं [1 2 3 शून्य शून्य झूठी])) सही परिणाम देता है। – animal

2
(defn truthy-count [coll] 
    (reduce + 0 
    (map #(if % 1 0) coll))) 

:

(count (remove nil? [1 2 3 nil nil])) => 3 
2

genral पैटर्न अनुक्रम परिणामों को फ़िल्टर और

(count (filter #(if % %) [1 2 3 nil nil false])) 
3 

#(if % %) truthyness कि एक आइटम केवल अगर यह truthy या कुछ falsy (शून्य) है रिटर्न के लिए बस एक छोटी परीक्षण है अन्यथा

+0

'(गिनती (फ़िल्टर (पहचान' दृष्टिकोण? – noahlz

+0

पर यह क्या फायदे हैं, यदि कोई है, तो "अगर यह आइटम सत्य है" तो यह अवधारणा व्यक्त करने का एक अलग तरीका है, हालांकि मुझे यह और अधिक स्पष्ट लगता है कि यह सिर्फ मेरे राय –

6
गिनती है

मैं करने की सलाह देते हैं इस प्रकार इस को कम के साथ: इस तरह से कम करने का उपयोग कर के लिए

(defn count-truthy [coll] 
    (reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll)) 

कारण:

  • यह और अधिक कुशल होने की संभावना है, और Clojure के नए reducers कार्यक्षमता से लाभ होगा कि इस तथ्य के लिए सक्षम बनाता है कई संग्रह पर कम कर देता है
  • यह एक मध्यवर्ती अनुक्रम (जो होगा यदि आप फिल्टर की तरह एक आलसी अनुक्रम फ़ंक्शन का उपयोग किया बनाने टाल)

आप पहले से ही एक एहसास हुआ अनुक्रम है, तो निम्न भी एक अच्छा विकल्प है, के रूप में यह पाश में आदिम अंकगणित से लाभ होगा:

(defn count-truthy [coll] 
    (loop [s (seq coll) cnt 0] 
    (if s 
     (recur (next s) (if (first s) (inc cnt) cnt)) 
     cnt))) 
संबंधित मुद्दे