रूबी में दो सरणियों का संयोजन


82

निम्नलिखित हासिल करने का रूबी तरीका क्या है?

a = [1,2]
b = [3,4]

मुझे एक सरणी चाहिए:

=> [f(1,3) ,f(1,4) , f(2,3) ,f(2,4)]

@lucasarruda, जो ओपी से पूछ रहा है के समान नहीं है। की एक सरणी पैदा करेगा पिन [a[0], b[0]]और [a[1], b[1]]। इसमें शामिल नहीं होंगे [a[0], b[1]]a.zip(b) => [[1,3],[2,4]]
केएनजाद

धन्यवाद @Kejad, आप सही हैं। मेरी टिप्पणी हटा दी गई।
लुकासुरूदा

जवाबों:


148

आप productपहले सरणियों के कार्टेशियन उत्पाद प्राप्त करने के लिए उपयोग कर सकते हैं , फिर फ़ंक्शन परिणाम एकत्र कर सकते हैं।

a.product(b) => [[1, 3], [1, 4], [2, 3], [2, 4]]

तो आप परिणाम प्राप्त करने के लिए उपयोग कर सकते हैं mapया कर सकते हैं collect। वे एक ही विधि के लिए अलग-अलग नाम हैं।

a.product(b).collect { |x, y| f(x, y) }

उत्पाद केवल 1.9 के रूप में निर्मित है।
पेस्तो

7
उत्पाद 1.8.7 में है - मैं इसका उपयोग ठीक उसी तरह से करने के लिए करता हूं, जो पियर पूछ रहा है
क्रिस

1
@FloatingRock यह गलत है कि संयोजन अनुमति नहीं है। देखें ruby-doc.org/core-2.1.3/Array.html#method-i-product
जोश Diehl

1
@FloatingRock ऐसा नहीं है। प्रत्येक आइटम का पहला तत्व हमेशा पहली सूची से आएगा, दूसरा तत्व दूसरी सूची से, और इसी तरह। यह तत्वों के सभी संभव संयोजन हैं, लेकिन वे कभी भी फिर से व्यवस्थित नहीं होते हैं, इसलिए यह क्रमपरिवर्तन नहीं है।
मार्क रीड

1
तीन सरणियों के लिए a.product(b,c)और इसके बाद (जब तक आप स्मृति से बाहर निकलते हैं)। रूबी कितनी मस्त है!
ओब्रोमियोस २३'१

11
a.map {|x| b.map {|y| f(x,y) } }.flatten

नोट: 1.8.7+ पर आप 1समतल करने के लिए एक तर्क के रूप में जोड़ सकते हैं , इसलिए आपको fकिसी सरणी को वापस करते समय सही परिणाम प्राप्त होंगे ।

यहाँ सरणियों की एक मनमानी संख्या के लिए एक अमूर्त है:

def combine_arrays(*arrays)
  if arrays.empty?
    yield
  else
    first, *rest = arrays
    first.map do |x|
      combine_arrays(*rest) {|*args| yield x, *args }
    end.flatten
      #.flatten(1)
  end
end

combine_arrays([1,2,3],[3,4,5],[6,7,8]) do |x,y,z| x+y+z end
# => [10, 11, 12, 11, 12, 13, 12, 13, 14, 11, 12, 13, 12, 13, 14, 13, 14, 15, 12, 13, 14, 13, 14, 15, 14, 15, 16]

यह काम करेगा हालांकि मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है (हालांकि एक बेहतर एक के बारे में सोच भी नहीं सकता है +1)
रॉबर्ट मासैओली

मैं चाहता हूं कि मैं बकाया राशि के संयोजन के लिए +2 कर सकता हूं। बहुत ही शांत!
घाटोटलफौ

मैं इसके साथ भी बाहर आया था .. लेकिन फिर मुझे पता था कि इसे करने का एक आसान तरीका होना चाहिए ... +1 इसके लिए पर @Aaron Hinni ने अपने क्लीनर को जवाब दिया
ऑरलैंडो

5

पहलुओं में Array#productआपको ऐरे का क्रॉस उत्पाद मिलेगा। यह ** operatorदो-सरणी मामले के लिए भी अलियास है। इसका उपयोग करते हुए, यह इस तरह दिखेगा:

require 'facets/array'
a = [1,2]
b = [3,4]

(a.product b).collect {|x, y| f(x, y)}

यदि आप रूबी 1.9 का उपयोग कर रहे हैं, productतो एक अंतर्निर्मित ऐरे फ़ंक्शन है।


लोग Array # उत्पाद को 1.9ism क्यों कहते रहते हैं? यह 1.8.7 में है, कम से कम।
मार्क रीड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.