2017-12-27 105 views
10

सामान्य मैपिंग एक सूची तत्व पर एक फ़ंक्शन लागू करता है और परिणामी सूची का एक तत्व उत्पन्न करता है। उदा।, यदि सूची (1, 2, 3,) है और स्क्वायर फ़ंक्शन को मानचित्रित करती है, तो आपको एक नई सूची (1, 4, 9,) मिलती है।क्रमिक सूची तत्वों के समूह के मैपिंग करने का सरल तरीका

क्या सूची के अनुक्रमिक तत्वों के समूह को मानचित्र बनाने का कोई तरीका है? उदाहरण के लिए, यदि सूची <8 2 7 2 6 9 4 9 6 1> है और मैं <10 9 9 8 15 13 13 15 7> बनाने के लिए सूची के प्रत्येक 2 तत्वों के योग की गणना करना चाहता हूं?

मैं निश्चित रूप से सूची को पार करने के लिए एक दिनचर्या लिख ​​सकता हूं। लेकिन मैं एक आसान तरीका ढूंढ रहा हूं, जैसे कमी ऑपरेटर या इकट्ठा/लेना।

उत्तर

11

आप ca n अतिव्यापी उप-सूचियों में एक सूची विभाजन .rotor विधि का उपयोग करें:

say <8 2 7 2 6 9 4 9 6 1>.rotor(2 => -1); 

# Output: 
# ((8 2) (2 7) (7 2) (2 6) (6 9) (9 4) (4 9) (9 6) (6 1)) 

2 => -1 एक Pair तर्क जो विधि है कि यह जा रहा द्वारा उप-सूचियों उत्पन्न करनी चाहिए करने के लिए का प्रतीक है कि "दो आगे, एक वापस" हर कदम पर।

तो फिर तुम बस प्रत्येक sublist करने के लिए अपने ऑपरेशन (जैसे योग) लागू करने के लिए .map उपयोग कर सकते हैं:

say <8 2 7 2 6 9 4 9 6 1>.rotor(2 => -1).map(*.sum); 

# Output: 
# (10 9 9 8 15 13 13 15 7) 
+2

धन्यवाद smls !! यह भी खूब रही !! मुझे और भी प्यार perl6 बनाता है !! – lisprogtor

6

ऐसा करने के लिए कार्यात्मक प्रोग्रामिंग तरीका सूची को दो बार संदर्भित करना, किसी तत्व द्वारा एक संस्करण को ऑफ़सेट करना और उन्हें एक साथ ज़िप करना है। यह आपको बाद के तत्वों के सभी tuples देता है।

my @l := <a b c d e f>; 
say @l Z @l[1..*]; # output: ((a b) (b c) (c d) (d e) (e f)) 

आप सूची पकड़, given का उपयोग करें (और do given उपयोग करें यदि आप बयान की जरूरत है एक मूल्य के वापस जाने के लिए) के लिए एक अस्थायी चर बनाने के लिए नहीं करना चाहते हैं:

given <8 2 7 2 6 9 4 9 6 1> { 
    say ($_ Z $_[1..*]).map: -> [$a, $b] { $a+$b }; 
} 

आप अगर ' एक समारोह है कि दो पैरामीटर लेता है का उपयोग कर रहे हैं, तो आप ज़िप करने के बाद सूची समतल करना चाहते हैं और map एक समय में दो तत्वों लेते हैं हो सकता है:

given <8 2 7 2 6 9 4 9 6 1> { 
    say ($_ Z $_[1..*]).flat.map(&infix:<+>); 
} 
+1

आपको बहुत बहुत धन्यवाद, piojo !! आपका जवाब वास्तव में मदद की !! क्या आपके पास [$ a, $ b] या ($ a, $ b) की बजाय @ [$ a, $ b] का उपयोग करने का कोई कारण है? वे सभी एक ही परिणाम देते हैं। एक बार फिर धन्यवाद! – lisprogtor

+0

@smls धन्यवाद, मैंने इसे बदल दिया। – piojo

+0

@lisprogtor मुझे एहसास नहीं हुआ कि आप बिना परिवर्तनीय नाम या सिगिल के विनाश कर सकते हैं। मुझे बताने के लिए धन्यवाद। मैंने उदाहरण अपडेट किया। – piojo

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