পাইথনের জিপ ফাংশনের সমতুল্য জাভাস্ক্রিপ্ট


216

পাইথনের জিপ ফাংশনের সমতুল্য কোনও জাভাস্ক্রিপ্ট রয়েছে? এটি হল, সমান দৈর্ঘ্যের একাধিক অ্যারে দেওয়া জোড়ার অ্যারে তৈরি করে।

উদাহরণস্বরূপ, যদি আমার কাছে তিনটি অ্যারে থাকে যা দেখতে এরকম দেখায়:

var array1 = [1, 2, 3];
var array2 = ['a','b','c'];
var array3 = [4, 5, 6];

আউটপুট অ্যারে হওয়া উচিত:

var output array:[[1,'a',4], [2,'b',5], [3,'c',6]]

5
এ কথাটি কি ন্যায়সঙ্গত যে আমরা পাইথন প্রোগ্রামাররা লুপগুলিকে জড়িত বোবা পদ্ধতিগুলি সম্পর্কে 'ভীত', কারণ তারা ধীর're তবে জাভাস্ক্রিপ্টে আমাদের কেবল এটির সাথে চালিত হওয়া উচিত এবং আমাদের লুপগুলি লিখতে হবে কারণ সেগুলি বিশেষ ধীর নয়?
লন্ডনরব

3
@ লন্ডনরব একটি লুপ একটি লুপ যা একটি 'দ্রুত' পদ্ধতির আড়ালে লুকানো বা না। জাভাস্ক্রিপ্ট স্পষ্টভাবে অ্যারে এর প্রবর্তনের সঙ্গে উচ্চতর ক্রম ফাংশন জন্য আরো সহায়তা করা হচ্ছে, forEach, reduce, map, every, ইত্যাদি এটা ঠিক ক্ষেত্রে ছিল যে zipহয়নি "কাটা করতে" নয় (ক flatMapএছাড়াও অনুপস্থিত), কর্মক্ষমতা বিবেচনার জন্য নয় - কিন্তু ভাল হতে হবে। নেট (3.5) এর কয়েক বছর ধরে গণনার জন্য একটি জিপ নেই! আন্ডারস্কোর / লড্যাশের মতো কোনও 'ফাংশনালিশ' লাইব্রেরি (লড্যাশ 3.x অলস ক্রমের মূল্যায়ন রয়েছে) একটি সমমানের জিপ ফাংশন সরবরাহ করবে।
ব্যবহারকারী 2864740

@ ইউজার ২64646440৪০ ব্যাখ্যিত লুপটি (যেমন পাইথনে যেমন) সবসময় মেশিন কোড লুপের চেয়ে অনেক ধীর হয়ে যায়। একটি জেআইটি-সংকলিত লুপ (যেমন আধুনিক জেএস ইঞ্জিনগুলিতে) দেশীয় সিপিইউ গতির কাছে যেতে পারে, যাতে মেশিন কোড লুপ ব্যবহার করে প্রবর্তনটি বেনাম ফাংশন কলের ওভারহেড দ্বারা অফসেট হতে পারে। তবুও, এই বিল্টিন ফাংশনগুলি থাকা এবং বেশ কয়েকটি জেএস ইঞ্জিনের সাহায্যে আপনার "অভ্যন্তরীণ লুপগুলি" এর বিভিন্ন প্রকারের প্রোফাইল তৈরি করা অর্থবোধ করে। ফলাফলগুলি সুস্পষ্ট নাও হতে পারে।
টোবিয়া

উত্তর:


178

২০১ update আপডেট:

এখানে একটি snazzier ইকমাস্ক্রিপ্ট 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"]]

(এবং ফিজিটিয়া দেখায় যে ES6 এর বৈচিত্র্যপূর্ণ আর্গুমেন্ট সিনট্যাক্স রয়েছে, সুতরাং নিম্নলিখিত ফাংশন সংজ্ঞাটি অজগরটির মতো কাজ করবে, তবে অস্বীকার করার জন্য নীচে দেখুন ... এটি তার নিজস্ব বিপরীত zip(zip(x))হবে না তাই সমান হবে না x; যদিও ম্যাট ক্র্যামার উল্লেখ করেছেন zip(...zip(...x))==x(যেমন নিয়মিত অজগরে zip(*zip(*x))==x))

বিকল্প সংজ্ঞা সমতুল্য। থেকে পাইথন { 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

(মনে রাখবেন যে ...সিনট্যাক্সের এই সময়ে পারফরম্যান্সের সমস্যা থাকতে পারে এবং ভবিষ্যতে সম্ভবত ভবিষ্যতেও হতে পারে, তাই যদি আপনি ভিন্ন ভিন্ন যুক্তি দিয়ে দ্বিতীয় উত্তরটি ব্যবহার করেন তবে আপনি এটি পরীক্ষা নিখুঁত করতে চাইতে পারেন))


এখানে একজন অনেলিনার:

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 অতিরিক্ত লাইন লাগে takes

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()
// []

আপনি যদি এই শেষ দুটি সংস্করণটি (ভেরিয়াদিক ওরফে একাধিক-যুক্তি সংস্করণ) ব্যবহার করেন তবে জিপটি আর তার নিজস্ব বিপরীত হবে না। 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(...)যদি ইতিমধ্যে একটি লিখে থাকেন তবে আপনি পাইথন-স্টাইলের ফাংশন ব্যবহার করতে পারেন Event অবশেষে আপনি ECMAScript অ্যারে উপলব্ধি বা জেনারেটর ব্যবহার করতে সক্ষম হবেন))


1
এটি আমার পক্ষে কাজ করে না: প্রকারের ত্রুটি: অবজেক্ট 1 এর কোনও পদ্ধতি 'মানচিত্র' নেই
ইমানুওল পাওলিনী

7
এবং বৈকল্পিক আরোগুলি এবং যে কোনও পুনরাবৃত্তীয় এর জন্য ES6:zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]));
1983

"অবজেক্ট 1 এর কোনও পদ্ধতিতে 'মানচিত্র নেই" সম্ভবত এটি কোনও পোস্টে অ্যাডেন্ডামে আচ্ছাদিত মানচিত্র পদ্ধতিতে (যেমন নোডলিস্ট বা একটি স্ট্রিং) কোনও অবজেক্টে এটি ব্যবহারের চেষ্টা করার একটি ঘটনা probably
নিনজেকেকো

যদিও এটি সত্য যে বৈকল্পিক ES6 সংস্করণ সংরক্ষণ করা যায় না zip(zip(x)) = x, আপনি এখনও আত্মবিশ্বাসের উপর নির্ভর করতে পারেন zip(...zip(...x)) = x
ম্যাট ক্রেমার

const the_longest_array_length = Math.max(...(arrays.map(array => array.length)));
Ван

34

লাইব্রেরি অ্যান্ডস্কোর দেখুন

অ্যান্ডস্কোর 100 টিরও বেশি ফাংশন সরবরাহ করে যা আপনার প্রিয় ওয়ার্কডে ফাংশনাল সহায়ক উভয়কেই সমর্থন করে: মানচিত্র, ফিল্টার, অনুরোধ - পাশাপাশি আরও বিশেষ গডিজ: ফাংশন বাইন্ডিং, জাভাস্ক্রিপ্ট টেম্প্লেটিং, দ্রুত সূচি তৈরি করা, গভীর সমতা পরীক্ষা করা ইত্যাদি।

- যারা বানিয়েছেন তাদের বলুন

আমি সম্প্রতি এটি বিশেষভাবে zip()ফাংশনটির জন্য ব্যবহার করতে শুরু করেছি এবং এটি প্রথম দারুণ প্রভাব ফেলেছে। আমি jQuery এবং কফিস্ক্রিপ্ট ব্যবহার করছি, এবং এটি ঠিক তাদের সাথে পুরোপুরি যায়। ইন্দোরকোর ঠিক সেখান থেকে উঠে যায় যেখানে তারা ছেড়ে যায় এবং এখনও পর্যন্ত এটি আমাকে হতাশ করে না। ওহ, যাইহোক, এটি কেবল 3 কেবি মিনিট করা হয়েছে।

এটা দেখ:

_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
// returns [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]

3
অ্যান্ডস্কোর ব্যবহার করার সময়, আপনি হাস্কেলের স্পষ্টতা এবং যৌক্তিক স্বাচ্ছন্দ্যের কিছুটা কাছাকাছি অনুভব করেন।
ক্যামিলবি

12
আন্ডারস্কোরের পরিবর্তে, এটিকে চেষ্টা করুন: লড্যাশ ডট কম - ড্রপ-ইন প্রতিস্থাপন, একই দুর্দান্ত স্বাদ, আরও বৈশিষ্ট্য, আরও ক্রস ব্রাউজারের ধারাবাহিকতা, আরও ভাল পারফ। একটি বিবরণের জন্য kitcambridge.be/blog/say-hello-to-lo-dash দেখুন ।
মের্লিন মরগান-গ্রাহাম

16

নিনজেকেকোর দুর্দান্ত এবং বিস্তৃত উত্তর ছাড়াও, দুটি জেএস-অ্যারে "টুপল-মিমিক" এ জিপ করতে যা লাগে তা হ'ল:

//Arrays: aIn, aOut
Array.prototype.map.call( aIn, function(e,i){return [e, aOut[i]];})

ব্যাখ্যা:
যেহেতু জাভাস্ক্রিপ্টের কোনও tuplesপ্রকার নেই, তাই ভাষা বর্ণনায় টিপলস, তালিকাগুলি এবং সেটগুলির জন্য উচ্চ অগ্রাধিকার ছিল না।
অন্যথায়, অনুরূপ আচরণ জেএস> 1.6 এ অ্যারে মানচিত্রের মাধ্যমে সোজা পদ্ধতিতে অ্যাক্সেসযোগ্য । ( mapআসলে প্রায়শই জেএস ইঞ্জিন নির্মাতারা অনেকগুলি> জেএস 1.4 ইঞ্জিনে সুনির্দিষ্ট না হওয়া সত্ত্বেও বাস্তবায়িত হন)।
পাইথন এর প্রধান পার্থক্য zip, izip... থেকে ফলাফল mapএর কার্মিক শৈলী, যেহেতু mapএকটি ফাংশন-যুক্তি প্রয়োজন। অতিরিক্তভাবে এটি Arrayঅন্তরালের একটি ফাংশন । Array.prototype.mapপরিবর্তে কেউ ব্যবহার করতে পারে , যদি ইনপুটটির জন্য অতিরিক্ত ঘোষণা কোনও সমস্যা হয়।

উদাহরণ:

_tarrin = [0..constructor, function(){}, false, undefined, '', 100, 123.324,
         2343243243242343242354365476453654625345345, 'sdf23423dsfsdf',
         'sdf2324.234dfs','234,234fsf','100,100','100.100']
_parseInt = function(i){return parseInt(i);}
_tarrout = _tarrin.map(_parseInt)
_tarrin.map(function(e,i,a){return [e, _tarrout[i]]})

ফলাফল:

//'('+_tarrin.map(function(e,i,a){return [e, _tarrout[i]]}).join('),\n(')+')'
>>
(function Number() { [native code] },NaN),
(function (){},NaN),
(false,NaN),
(,NaN),
(,NaN),
(100,100),
(123.324,123),
(2.3432432432423434e+42,2),
(sdf23423dsfsdf,NaN),
(sdf2324.234dfs,NaN),
(234,234fsf,234),
(100,100,100),
(100.100,100)

সম্পর্কিত পারফরম্যান্স:

ব্যবহার mapউপর for-loops:

দেখুন: [1,2] এবং [7,8] কে [[1,7], [2,8]] এ মার্জ করার সবচেয়ে দক্ষ উপায় কী?

জিপ পরীক্ষা

নোট: বেস ধরনের যেমন falseএবং undefinedএকটি প্রটোটাইপ অবজেক্ট অনুক্রমের posess না এবং এইভাবে একটি প্রকাশ করবেন না তা toStringফাংশন। সুতরাং এগুলি আউটপুটে খালি হিসাবে দেখানো হয়েছে।
যেহেতু parseIntদ্বিতীয় আর্গুমেন্টটি বেস / সংখ্যার রেডিক্স, যার সাথে সংখ্যাকে রূপান্তর করা mapযায় এবং যেহেতু সূচকটিকে তার যুক্তি-ফাংশনের দ্বিতীয় আর্গুমেন্ট হিসাবে পাস করে, একটি মোড়ক ফাংশন ব্যবহৃত হয়।


আপনার প্রথম উদাহরণটি বলার পরে "এআইএন কোনও ফাংশন নয়" বলে। যদি আমি প্রোটোটাইপের পরিবর্তে অ্যারে থেকে .map কল করি তবে এটি কাজ করে: aIn.map(function(e, i) {return [e, aOut[i]];})ভুল কী?
নওমেনন

1
@ নুমেনন, উত্তরটি ঠিক করা Array.prototype.mapউচিত ছিল Array.prototype.map.call
ব্যবহারকারী

11

জেনারেটরের সাথে আধুনিক ES6 উদাহরণ:

function *zip (...iterables){
    let iterators = iterables.map(i => i[Symbol.iterator]() )
    while (true) {
        let results = iterators.map(iter => iter.next() )
        if (results.some(res => res.done) ) return
        else yield results.map(res => res.value )
    }
}

প্রথমত, আমরা পুনরাবৃত্ত হিসাবে একটি তালিকা পাই iterators। এটি সাধারণত স্বচ্ছভাবে ঘটে থাকে, তবে আমরা এখানে এটি স্পষ্টভাবেই করি, যতক্ষণ না তাদের একটির অবসন্ন না হওয়া পর্যন্ত আমরা ধাপে ধাপে ধাপে ফলদান করি। .some()প্রদত্ত অ্যারেতে কোনও ফলাফল ( পদ্ধতি ব্যবহার করে ) শেষ হয়ে গেছে কিনা তা আমরা পরীক্ষা করি এবং যদি তা হয় তবে আমরা যখন লুপটি ভাঙ্গি।


এই উত্তর আরও ব্যাখ্যা ব্যবহার করতে পারে।
cmaher

1
আমরা পুনরাবৃত্তিযোগ্য থেকে পুনরাবৃত্তির একটি তালিকা পাই। এটি সাধারণত স্বচ্ছভাবে ঘটে থাকে, এখানে আমরা এটি স্পষ্টভাবেই করি, যতক্ষণ না আমরা ধাপে ধাপে ধীরে ধীরে উপার্জন করি ততক্ষণ তার মধ্যে একটি নিঃশেষ হয়ে যায়। অ্যারের মধ্যে তাদের (.some () পদ্ধতিটি শেষ হয়ে গেছে কিনা তা পরীক্ষা করে দেখুন এবং এটি যদি হয় তবে আমরা বাধা দিই।
দিমিত্রিস

11

পাইথন-এর মতো অন্যান্য ক্রিয়াকলাপগুলির সাথে পাইথন প্রতিরূপের আচরণের মতো অলস মূল্যায়ন ফিরিয়ে দেওয়ার অতিরিক্ত সুবিধা সহ pythonicএকটি zipফাংশন সরবরাহ করে :Iterator

import {zip, zipLongest} from 'pythonic';

const arr1 = ['a', 'b'];
const arr2 = ['c', 'd', 'e'];
for (const [first, second] of zip(arr1, arr2))
    console.log(`first: ${first}, second: ${second}`);
// first: a, second: c
// first: b, second: d

for (const [first, second] of zipLongest(arr1, arr2))
    console.log(`first: ${first}, second: ${second}`);
// first: a, second: c
// first: b, second: d
// first: undefined, second: e

// unzip
const [arrayFirst, arraySecond] = [...zip(...zip(arr1, arr2))];

প্রকাশ আমি পাইথোনিকের লেখক এবং রক্ষণাবেক্ষণকারী


7

পাইথনের দুটি ফাংশন রয়েছে: জিপ এবং itertools.zip_longest। জেএস / ইএস 6 এর বাস্তবায়ন এরকম:

জেএস / ইএস 6 তে বাস্তবায়ন পাইথনের জিপ

const zip = (...arrays) => {
    const length = Math.min(...arrays.map(arr => arr.length));
    return Array.from({ length }, (value, index) => arrays.map((array => array[index])));
};

ফলাফল:

console.log(zip(
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    [11, 221]
));

[[১, 676767, ১১১, ১১]]

console.log(zip(
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111, 212, 323, 433, '1111']
));

[[1, 667, 111], [2, ভুয়া, 212], [3, -378, 323], ['এ', '337', 433]]

console.log(zip(
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[]

জেএস / ইএস 6 তে পাইথনের zip_longest বাস্তবায়ন

( https://docs.python.org/3.5/library/itertools.html?hightlight=zip_longest#itertools.zip_longest )

const zipLongest = (placeholder = undefined, ...arrays) => {
    const length = Math.max(...arrays.map(arr => arr.length));
    return Array.from(
        { length }, (value, index) => arrays.map(
            array => array.length - 1 >= index ? array[index] : placeholder
        )
    );
};

ফলাফল:

console.log(zipLongest(
    undefined,
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[[১, 676767, ১১১, অপরিশোধিত], [২, ভুয়া
, অপরিজ্ঞাত, অপরিজ্ঞাত ], [৩, -৩78,, অপরিজ্ঞাত, অপরিজ্ঞাত], ['এ', '৩৩7', অপরিজ্ঞাত

console.log(zipLongest(
    null,
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[[১, 676767, ১১১, নাল], [২, মিথ্যা, নাল, নাল], [৩, -৩78,, নাল, নাল], ['এ', '৩৩7', নাল, নাল]]

console.log(zipLongest(
    'Is None',
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[[১, 676767, ১১১, 'কেউই নেই'], [২, মিথ্যা, 'কেউ নয়', 'কেউ নয়'],
[৩, -৩78,, 'ইস কেউ নয়', 'কেউ নয়'], ['a ',' 337 ',' ইস আর কেউ নয় ',' ইস কিছুই নয় ']]


4

আপনি ES6 ব্যবহার করে ইউটিলিটি ফাংশন করতে পারেন।

const zip = (arr, ...arrs) => {
  return arr.map((val, i) => arrs.reduce((a, arr) => [...a, arr[i]], [val]));
}

// example

const array1 = [1, 2, 3];
const array2 = ['a','b','c'];
const array3 = [4, 5, 6];

console.log(zip(array1, array2));                  // [[1, 'a'], [2, 'b'], [3, 'c']]
console.log(zip(array1, array2, array3));          // [[1, 'a', 4], [2, 'b', 5], [3, 'c', 6]]

তবে উপরের দ্রবণটিতে প্রথম অ্যারের দৈর্ঘ্য আউটপুট অ্যারের দৈর্ঘ্য নির্ধারণ করে।

সমাধানটি এখানে আপনি এর উপর আরও নিয়ন্ত্রণ রাখতে পারেন। এটি কিছুটা জটিল তবে মূল্যবান।

function _zip(func, args) {
  const iterators = args.map(arr => arr[Symbol.iterator]());
  let iterateInstances = iterators.map((i) => i.next());
  ret = []
  while(iterateInstances[func](it => !it.done)) {
    ret.push(iterateInstances.map(it => it.value));
    iterateInstances = iterators.map((i) => i.next());
  }
  return ret;
}
const array1 = [1, 2, 3];
const array2 = ['a','b','c'];
const array3 = [4, 5, 6];

const zipShort = (...args) => _zip('every', args);

const zipLong = (...args) => _zip('some', args);

console.log(zipShort(array1, array2, array3)) // [[1, 'a', 4], [2, 'b', 5], [3, 'c', 6]]
console.log(zipLong([1,2,3], [4,5,6, 7]))
// [
//  [ 1, 4 ],
//  [ 2, 5 ],
//  [ 3, 6 ],
//  [ undefined, 7 ]]


4

1. এনপিএম মডিউল: zip-array

আমি একটি এনপিএম মডিউল পেয়েছি যা পাইথনের জাভাস্ক্রিপ্ট সংস্করণ হিসাবে ব্যবহার করা যেতে পারে zip:

জিপ-অ্যারে - পাইথনের জিপ ফাংশনের সমতুল্য একটি জাভাস্ক্রিপ্ট। প্রতিটি অ্যারের মানগুলি একত্রিত করে।

https://www.npmjs.com/package/zip-array

2. tf.data.zip()Tensorflow.js মধ্যে

টেনসরফ্লো.জেএস ব্যবহারকারীদের জন্য আরেকটি বিকল্প পছন্দ: zipজাভাস্ক্রিপ্টে টেনসরফ্লো ডেটাসেটগুলির সাথে কাজ করার জন্য যদি পাইথনে কোনও ফাংশন প্রয়োজন হয় তবে আপনি টেনসরফ্লো.জেএস ব্যবহার করতে পারেন tf.data.zip()

টেনসরফ্লো.জেএস তে tf.data.zip () এখানে নথিভুক্ত


3

জাভাস্ক্রিপ্ট নিজেই অন্তর্নির্মিত নয়। কিছু সাধারণ জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক (যেমন প্রোটোটাইপ) একটি বাস্তবায়ন সরবরাহ করে, বা আপনি নিজের লেখা লিখতে পারেন।


1
লিঙ্ক করবেন? এছাড়াও, আমি আরও আগ্রহী যদি jQuery এটি করে, যেহেতু আমি যা ব্যবহার করছি ...
pq।


2
তবে খেয়াল করুন যে jQuery একটি পাইথনের চেয়ে কিছুটা আলাদা আচরণ করে, যাতে এটি কোনও বস্তু দেয়, একটি অ্যারে দেয় না ... এবং এভাবে 2 টিরও বেশি তালিকাকে একসাথে জিপ করতে পারে না।
অ্যাম্বার

ঠিক আছে, লেখকের jQuery কে সমতুল্য বলা উচিত নয়।
pq।

3

@Brandon ভালো লেগেছে, আমি সুপারিশ আন্ডারস্কোর এর জিপ ফাংশন। তবে এটি দীর্ঘতম ইনপুটটির দৈর্ঘ্যের জন্য কোনও কিছু ফেরত দেওয়ার জন্য প্রয়োজনীয় zip_longestসংযোজনগুলির মতো কাজ করে undefined

আমি mixinএটিকে আন্ডারস্কোরটি প্রসারিত করার জন্য পদ্ধতিটি ব্যবহার করেছি zipShortest, যা পাইথনের মতো কাজ করে zip, এটি লাইব্রেরির নিজস্ব উত্সেরzip ভিত্তিতে ।

আপনি নিম্নলিখিতটি আপনার সাধারণ জেএস কোডে যুক্ত করতে পারেন এবং তারপরে এটিকে কল করতে পারেন যেন এটি আন্ডারস্কোরের অংশ: _.zipShortest([1,2,3], ['a'])রিটার্ন [[1, 'a']], উদাহরণস্বরূপ।

// Underscore library addition - zip like python does, dominated by the shortest list
//  The default injects undefineds to match the length of the longest list.
_.mixin({
    zipShortest : function() {
        var args = Array.Prototype.slice.call(arguments);
        var length = _.min(_.pluck(args, 'length')); // changed max to min
        var results = new Array(length);
        for (var i = 0; i < length; i++) {
            results[i] = _.pluck(args, "" + i);
        }
        return results;
}});

কোনও মন্তব্য ছাড়াই ডাউনভোট? আমি এই উত্তরটি উন্নত করতে পেরে খুশি, তবে প্রতিক্রিয়া ছাড়াই পারি না।
প্যাট

2

আপনি অ্যারের অ্যারে হ্রাস করতে পারেন এবং অভ্যন্তরের অ্যারের সূচকের ফলাফল গ্রহণ করে নতুন অ্যারে মানচিত্র করতে পারেন।

var array1 = [1, 2, 3],
    array2 = ['a','b','c'],
    array3 = [4, 5, 6],
    array = [array1, array2, array3],
    transposed = array.reduce((r, a) => a.map((v, i) => (r[i] || []).concat(v)), []);

console.log(transposed);


1

অলস জেনারেটর সমাধানের একটি প্রকরণ :

function* iter(it) {
    yield* it;
}

function* zip(...its) {
    its = its.map(iter);
    while (true) {
        let rs = its.map(it => it.next());
        if (rs.some(r => r.done))
            return;
        yield rs.map(r => r.value);
    }
}

for (let r of zip([1,2,3], [4,5,6,7], [8,9,0,11,22]))
    console.log(r.join())

// the only change for "longest" is some -> every

function* zipLongest(...its) {
    its = its.map(iter);
    while (true) {
        let rs = its.map(it => it.next());
        if (rs.every(r => r.done))
            return;
        yield rs.map(r => r.value);
    }
}

for (let r of zipLongest([1,2,3], [4,5,6,7], [8,9,0,11,22]))
    console.log(r.join())

এবং এটি অজগরটির ক্লাসিক "এন-গ্রুপ" আইডিয়াম zip(*[iter(a)]*n):

triples = [...zip(...Array(3).fill(iter(a)))]

আমি ভাবছি যে এটির সাথে কী ভুল, আমি ঠিক একইটি লিখেছিলাম। আমার কাছে এটি অন্য সবার চেয়ে ভাল মনে হয়েছে তবে আমরা দুজনই ভুল ... আমি এতে প্রবাহের প্রকার যুক্ত করার উপায় খুঁজছিলাম, তবে আমি লড়াই করছি: ডি।
সিগ্লেসেট

0

Mochikit গ্রন্থাগার এই এবং অন্যান্য অনেক ফাংশন পাইথন মত প্রদান করে। মোচিকিতের বিকাশকারীও একটি পাইথন ফ্যান, তাই এটিতে পাইথনের সাধারণ স্টাইল রয়েছে, এবং অ্যাসিঙ্ক কলকে মোচড়ের মতো কাঠামোয় মোড়ানো।


0

উপরে পোস্ট করা প্লাগইনগুলি কীভাবে কাজটি করল তা ভাবতে ভাবতে খাঁটি জেএসে আমি এগুলি চালিয়েছি। আমার ফলাফল এখানে। আমি এটি এই বলে উপস্থাপন করব যে এটি IE এবং এর মতো কতটা স্থিতিশীল হবে তা আমার কোনও ধারণা নেই। এটি কেবল একটি দ্রুত মকআপ।

init();

function init() {
    var one = [0, 1, 2, 3];
    var two = [4, 5, 6, 7];
    var three = [8, 9, 10, 11, 12];
    var four = zip(one, two, one);
    //returns array
    //four = zip(one, two, three);
    //returns false since three.length !== two.length
    console.log(four);
}

function zip() {
    for (var i = 0; i < arguments.length; i++) {
        if (!arguments[i].length || !arguments.toString()) {
            return false;
        }
        if (i >= 1) {
            if (arguments[i].length !== arguments[i - 1].length) {
                return false;
            }
        }
    }
    var zipped = [];
    for (var j = 0; j < arguments[0].length; j++) {
        var toBeZipped = [];
        for (var k = 0; k < arguments.length; k++) {
            toBeZipped.push(arguments[k][j]);
        }
        zipped.push(toBeZipped);
    }
    return zipped;
}

এটি বুলেটপ্রুফ নয়, তবে এটি এখনও আকর্ষণীয়।


jsfiddle দেখতে সুন্দর লাগছে। একটি TidyUp বোতাম আছে! রান বোতামটি ফলাফল প্যানেলে আপনার কনসোল.লগ আউটপুটটি দেখায় না। কেন?
pq।

এটি (কনসোল.লগ) চালানোর জন্য ফায়ারব্যাগের মতো কিছু দরকার। শুধু স্যুইচ console.logকরুন alert

এর জন্য ফলাফল ফলকটি কী?
pq।

এটি ফিডলের এইচটিএমএল দেখায়। এই ক্ষেত্রে, আমি কেবল স্ট্রেস জেএস করছি। document.write() Jsfiddle.net/PyTWw/5


-1

আপনি যদি ES6 এর সাথে ভাল থাকেন:

const zip = (arr,...arrs) =>(
                            arr.map(
                              (v,i) => arrs.reduce((a,arr)=>[...a, arr[i]], [v])))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.