SORU
31 Ocak 2011, PAZARTESİ


Javascript'In Python eşdeğer zip fonksiyonu

Python posta işlevi javascript bir karşılığı var mıdır? Yani, eşit uzunlukta iki dizi çiftleri verilen bir dizi oluşturun.

Eğer üç diziler var örneğin, bu gibi görünüyor:

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

Çıktı dizi olmalıdır:

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

CEVAP
23 NİSAN 2012, PAZARTESİ


İşte bir 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(...)

Yukarıdaki diziler olması gerektiği gibi eşit boyutta, varsayar. Ayrıca listeler değişken, bağımsız değişken listesi variadic nerede Python sürümü aksine tek bir listede geçirmek varsayar.Eğer bunların hepsini istiyorsanız"", aşağıya bakın. özellikleri Kod sadece 2 satır fazladan alır.

Aşağıdaki Python diziler eşit büyüklükte olmayan, sessizce numara artık diziler parçaları yok: kenar durumlarda 11 ** hareketlerini taklit eder

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

Bu Python itertools.zip_longest davranış, diziler tanımlı değildir undefined takma taklit

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

Bu son iki sürümü kullanın (variadic aka. -değişken birden çok sürümü), zip, artık kendi ters. Taklit edin zip(*[...]) deyim Python, yapmak gerekir zip.apply(this, [...]) ne zaman ters çevir zip işlev ya da isterseniz aynı şekilde bir değişken sayı listesi olarak girdi.


ek:

Bu herhangi bir iterable (örneğin Python dizeleri, aralıkları, harita nesneleri, vb zip kullanabilirsiniz.) işlemek, yapmak için aşağıdaki tanımlayabilirsiniz

function iterView(iterable) {
    // returns an array equivalent to the iterable
}

Ancak, eğer gerekli değil, hatta way aşağıdaki: zip yazın

function zip(arrays) {
    return Array.apply(null,Array(arrays[0].length)).map(function(_,i){
        return arrays.map(function(array){return array[i]})
    });
}

Demo:

> JSON.stringify( zip(['abcde',[1,2,3,4,5]]) )
[["a",1],["b",2],["c",3],["d",4],["e",5]]

(Ya range(...) Python tarzı bir kullanabilirsin eğer zaten bir tane yazdım eğer işlevi. Sonunda ECMA dizi üreteçleri veya jeneratörleri kullanmak mümkün olacak.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • filmurfreakur

    filmurfreaku

    29 Mart 2007
  • RinconDynamic

    RinconDynami

    1 EKİM 2011