2010-07-23 13 views
14

कहो मेरे पास है:मैं एक संग्रह में सभी तत्वों को किसी अन्य संग्रह में सभी तत्वों के साथ गुणा कैसे करूं?

(def s1 [1 2 3 4 5]) 
(def s2 [1 2 3 4 5]) 

s1 में हर x के लिए, मैं s2 में हर y साथ गुणा करना चाहते हैं।


स्पष्ट करने के लिए, मैं मूल रूप से कार्तीय उत्पाद चाहते हैं, इसलिए मैं यहाँ नहीं लगता map काम करता है।

+1

बस मस्ती के लिए, यहां अन्य भाषाओं में कुछ समाधान दिए गए हैं। Erlang (और सूची समझ के साथ किसी भी अन्य भाषा): '[एक्स * वाई || एक्स <- एस 1, वाई <- एस 2] 'रूबी (1.8.7+):' s1.product (s2) .map {| x, y | एक्स * वाई} ' –

उत्तर

22
(for [x1 s1 
     x2 s2] 
    (* x1 x2)) 
+11

यह ... सुंदर है। * एक आंसू शेड करता है * –

+0

मैं क्लोजर के लिए बहुत नया हूं, और सामान्य रूप से कार्यात्मक प्रोग्रामिंग, भले ही मुझे पता है कि यह क्या करता है ... यह अभी भी मेरे सिर को लपेटने के लिए अजीब और कठिन लगता है। क्या आप वर्णन कर सकते हैं कि वहां क्या हो रहा है? –

+3

सबसे पहले, आप क्लोजर आरईपीएल में '(डॉक फॉर)' टाइप कर सकते हैं ताकि उम्मीद की जा सके कि 'क्या' करता है; अगर आपको लगता है कि यह आपकी उम्मीदों से कम आता है, तो आपका अनुभव डॉकस्ट्रिंग में सुधार करने में मदद कर सकता है! दूसरा, यहां एक संक्षिप्त सारांश दिया गया है: 'के लिए' एक बाध्यकारी वेक्टर और एक "शरीर" अभिव्यक्ति लेता है। बाध्यकारी वेक्टर में स्थानीय लोगों के नाम (उपरोक्त में 'x1' और 'x2') और अनुक्रम-निर्माण अभिव्यक्तियां (' s1' और 's2') शामिल हैं। सीईक्स के कार्टेशियन उत्पाद (यहां प्रत्येक ('x1',' x2') के उत्पाद में 's1' और' s2' के उत्पाद में प्रत्येक टुपल आइटम के लिए शरीर का मूल्यांकन किया जाता है)। –

2

यहाँ मीकल के कोड के बराबर जावा 1.5 (या नवीनतम) है:

List<Integer> numbers = new ArrayList<Integer>();  

for(int x1 : s1) { 
    for(int x2 : s2) { 
    numbers.add(x1 * x2); 
    } 
} 

अंतर यह है कि जावा में for छोरों एक दृश्य नहीं लौटते जैसे वे clojure में करते हैं, तुम इतनी है परिणाम बनाने के लिए एक परिवर्तनीय ArrayList का उपयोग करने की आवश्यकता है।

निश्चित रूप से क्लोजर संस्करण जितना सुंदर नहीं है, लेकिन जावा 1.4 में आपको जो करना होगा उससे कहीं बेहतर है।

+1

लेकिन अभी भी ..clojure;) – blushrt

2

एक सरल, for की आधारभूत कार्यक्षमता के दृश्य प्रदर्शन:

user=> (pprint 
     (for [tens (range 10) 
       ones (range 10)] 
      [tens ones])) 
([0 0] 
[0 1] 
[0 2] 
[0 3] 
[0 4] 
[0 5] 
[0 6] 
[0 7] 
[0 8] 
[0 9] 
[1 0] 
[1 1] 
[1 2] 
[1 3] 
[1 4] 
[1 5] 
[1 6] 
[1 7] 
[1 8] 
[1 9] 
[2 0] 
[2 1] 
[2 2] 
[2 3] 
[2 4] 
[2 5] 
[2 6] 
[2 7] 
[2 8] 
[2 9] 
[3 0] 
[3 1] 
[3 2] 
[3 3] 
[3 4] 
[3 5] 
[3 6] 
[3 7] 
[3 8] 
[3 9] 
[4 0] 
[4 1] 
[4 2] 
[4 3] 
[4 4] 
[4 5] 
[4 6] 
[4 7] 
[4 8] 
[4 9] 
[5 0] 
[5 1] 
[5 2] 
[5 3] 
[5 4] 
[5 5] 
[5 6] 
[5 7] 
[5 8] 
[5 9] 
[6 0] 
[6 1] 
[6 2] 
[6 3] 
[6 4] 
[6 5] 
[6 6] 
[6 7] 
[6 8] 
[6 9] 
[7 0] 
[7 1] 
[7 2] 
[7 3] 
[7 4] 
[7 5] 
[7 6] 
[7 7] 
[7 8] 
[7 9] 
[8 0] 
[8 1] 
[8 2] 
[8 3] 
[8 4] 
[8 5] 
[8 6] 
[8 7] 
[8 8] 
[8 9] 
[9 0] 
[9 1] 
[9 2] 
[9 3] 
[9 4] 
[9 5] 
[9 6] 
[9 7] 
[9 8] 
[9 9]) 
4

समाधान का उपयोग करते समय के लिए अच्छे है, यहाँ एक नक्शा -only अगर आप के लिए समझने परेशानियों संस्करण है:

(map #(map (partial * %) s2) s1) 

ऊपर के लिए कुछ इसी तरह करने के लिए फैलता है, सिवाय इसके कि यह आंशिक, कुछ इस तरह की बजाय किसी दूसरे गुमनाम समारोह का प्रयोग करेंगे:

(map (fn [x] (map (fn [y] (* x y)) s2)) s1) 

या, बड़े करीने से स्वरूपित:

(map 
    (fn [x] 
    (map 
     (fn [y] 
     (* x y)) 
     s2)) 
    s1) 
+0

विकल्प के लिए उपरोक्त। मुझे आश्चर्य है कि यह तेज है। –

+0

बीटीडब्लू, ** के लिए पहले के समान व्यवहार प्राप्त करने के लिए ** (बाहरी) मानचित्र को मैपकैट के साथ प्रतिस्थापित किया जाना चाहिए। – dimagog

+0

@Blaine अपने लिए देखें :-): ('clojure.pprint' का उपयोग करें (सेट-प्रिप्रिंट-प्रेषण कोड-प्रेषण) (पप्रिंट (मैक्रोएक्सपैंड '([x1 s1 x2 s2] (* x1 x2) के लिए))) – dimagog

1

के रूप में सरल रूप में यह हो सकता है:

(map * '(1 2) '(3 4)) 

निकलेगा:

(3 8) 
+0

एमएमएच ... जो कुछ मैं ढूंढ रहा था वह काफी नहीं था। यह मेरे अंग्रेजी विवरण से मेल खाता है, लेकिन मुझे शुरुआत से यह कहना चाहिए था कि मैं दो सेटों के कार्टेशियन उत्पाद की तलाश में था। मुझे नहीं पता था कि इसे क्या कहा जाता था। –

+0

ओह, वास्तव में, मुझे जवाबों को और सावधानीपूर्वक तैयार करना चाहिए था। – Jawher

संबंधित मुद्दे