2016 अपडेट:
यहाँ एक चकाचौंधा Ecmascript 6 संस्करण है:
zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c]))
चित्रण समान। करने के लिए अजगर { zip(*args)
}:
> zip([['row0col0', 'row0col1', 'row0col2'],
['row1col0', 'row1col1', 'row1col2']]);
[["row0col0","row1col0"],
["row0col1","row1col1"],
["row0col2","row1col2"]]
(और FizzyTea बताते हैं कि ES6 में वैरिएड तर्क वाक्य है, इसलिए निम्न फ़ंक्शन परिभाषा अजगर की तरह काम करेगी, लेकिन अस्वीकरण के लिए नीचे देखें ... यह इसका स्वयं का व्युत्क्रम नहीं zip(zip(x))
होगा, इसलिए बराबर नहीं होगा x
; हालांकि जैसा कि मैट क्रैमर बताते हैं zip(...zip(...x))==x
(जैसे) नियमित रूप से अजगर zip(*zip(*x))==x
))
वैकल्पिक परिभाषा equiv। करने के लिए अजगर { zip
}:
> zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]))
> zip( ['row0col0', 'row0col1', 'row0col2'] ,
['row1col0', 'row1col1', 'row1col2'] );
// note zip(row0,row1), not zip(matrix)
same answer as above
(कृपया ध्यान दें कि ...
इस समय वाक्यविन्यास में प्रदर्शन के मुद्दे हो सकते हैं, और संभवतः भविष्य में, इसलिए यदि आप दूसरे उत्तर का उपयोग वैरेडिक तर्कों के साथ करते हैं, तो आप इसे पूरा करना चाहते हैं।)
यहाँ एक oneliner है:
function zip(arrays) {
return arrays[0].map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}
// > zip([[1,2],[11,22],[111,222]])
// [[1,11,111],[2,22,222]]]
// If you believe the following is a valid return value:
// > zip([])
// []
// then you can special-case it, or just do
// return arrays.length==0 ? [] : arrays[0].map(...)
उपरोक्त मानता है कि सरणियाँ समान आकार की हैं, जैसा कि उन्हें होना चाहिए। यह भी मानता है कि आप पायथन के संस्करण के विपरीत सूचियों के तर्क की एक सूची में गुजरते हैं, जहां तर्क सूची परिवर्तनशील है। यदि आप इन सभी "सुविधाओं" को चाहते हैं, तो नीचे देखें। यह कोड की लगभग 2 अतिरिक्त लाइनें लेता है।
निम्नलिखित पायथन के zip
किनारे के मामलों की नक़ल करेगा, जहाँ सरणियाँ समान आकार की नहीं होती हैं, चुपचाप सरणियों के लंबे हिस्सों का दिखावा नहीं करते हैं:
function zip() {
var args = [].slice.call(arguments);
var shortest = args.length==0 ? [] : args.reduce(function(a,b){
return a.length<b.length ? a : b
});
return shortest.map(function(_,i){
return args.map(function(array){return array[i]})
});
}
// > zip([1,2],[11,22],[111,222,333])
// [[1,11,111],[2,22,222]]]
// > zip()
// []
यह पायथन के itertools.zip_longest
व्यवहार की नकल करेगा , undefined
जहां एरे को परिभाषित नहीं किया गया है:
function zip() {
var args = [].slice.call(arguments);
var longest = args.reduce(function(a,b){
return a.length>b.length ? a : b
}, []);
return longest.map(function(_,i){
return args.map(function(array){return array[i]})
});
}
// > zip([1,2],[11,22],[111,222,333])
// [[1,11,111],[2,22,222],[null,null,333]]
// > zip()
// []
यदि आप इन अंतिम दो संस्करणों (वैरिएड aka। एकाधिक-तर्क संस्करण) का उपयोग करते हैं, तो ज़िप अब अपना स्वयं का व्युत्क्रम नहीं है। zip(*[...])
पायथन से मुहावरे की नकल करने के लिए , आपको zip.apply(this, [...])
ज़िप फ़ंक्शन को उल्टा करना होगा या यदि आप इसी तरह इनपुट के रूप में सूचियों की एक चर संख्या चाहते हैं, तो आपको करना होगा।
परिशिष्ट :
इस हैंडल को किसी भी चलने योग्य बनाने के लिए (जैसे कि पायथन में आप zip
स्ट्रिंग्स, रेंज, मैप ऑब्जेक्ट्स आदि पर उपयोग कर सकते हैं ), आप निम्नलिखित को परिभाषित कर सकते हैं:
function iterView(iterable) {
// returns an array equivalent to the iterable
}
हालांकि अगर आप zip
निम्नलिखित तरीके से लिखते हैं , तो भी यह आवश्यक नहीं होगा:
function zip(arrays) {
return Array.apply(null,Array(arrays[0].length)).map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}
डेमो:
> JSON.stringify( zip(['abcde',[1,2,3,4,5]]) )
[["a",1],["b",2],["c",3],["d",4],["e",5]]
(या range(...)
यदि आप पहले से ही लिख चुके हैं तो आप पायथन-शैली के फ़ंक्शन का उपयोग कर सकते हैं । आखिरकार आप ECMAScript सरणी समझ या जनरेटर का उपयोग करने में सक्षम होंगे।)