Gibt es ein Javascript-Äquivalent zur Zip-Funktion von Python? Das heißt, wenn mehrere Arrays gleicher Länge gegeben sind, wird ein Array von Paaren erzeugt.
Zum Beispiel, wenn ich drei Arrays habe, die so aussehen:
var array1 = [1, 2, 3];
var array2 = ['a','b','c'];
var array3 = [4, 5, 6];
Das Ausgabearray sollte sein:
var output array:[[1,'a',4], [2,'b',5], [3,'c',6]]
forEach
,reduce
,map
,every
etc. Es war nur der Fall , dasszip
nicht „den Schnitt“ hat (aflatMap
ist auch nicht vorhanden), nicht für Leistungsinformationen - aber Um fair zu sein, hatte .NET (3.5) ein paar Jahre lang keine Zip on Enumerable! Jede 'funktionalistische' Bibliothek wie Unterstrich / lodash (lodash 3.x hat eine verzögerte Sequenzauswertung) bietet eine äquivalente Zip-Funktion.Antworten:
Update 2016:
Hier ist eine schickere Ecmascript 6-Version:
Abbildung äquiv. zu Python {
zip(*args)
}:(und FizzyTea weist darauf hin , dass ES6 variadische Argument Syntax hat, so dass die folgende Funktionsdefinition wie Python handeln, aber unter Disclaimer siehe ... das wird nicht über eine eigene inverse sein , so
zip(zip(x))
wird nicht gleichx
, obwohl wie Matt Kramer weist darauf hinzip(...zip(...x))==x
(wie in regulärer Pythonzip(*zip(*x))==x
))Alternative Definition äquiv. zu Python {
zip
}:(Beachten Sie, dass die
...
Syntax zu diesem Zeitpunkt und möglicherweise in Zukunft möglicherweise Leistungsprobleme aufweist. Wenn Sie also die zweite Antwort mit verschiedenen Argumenten verwenden, möchten Sie sie möglicherweise perfekt testen.)Hier ist ein Oneliner:
Das Obige setzt voraus, dass die Arrays gleich groß sind, wie sie sein sollten. Es wird auch davon ausgegangen, dass Sie ein einzelnes Listenargument übergeben, im Gegensatz zu Pythons Version, bei der die Argumentliste variadisch ist. Wenn Sie alle diese "Funktionen" möchten , siehe unten. Es dauert nur etwa 2 zusätzliche Codezeilen.
Im Folgenden wird das
zip
Verhalten von Python in Randfällen nachgeahmt, in denen die Arrays nicht gleich groß sind, und es wird stillschweigend so getan, als ob die längeren Teile der Arrays nicht vorhanden wären:Dies ahmt das
itertools.zip_longest
Verhalten von Python nach und fügt ein,undefined
wo Arrays nicht definiert sind:Wenn Sie diese beiden letzten Versionen verwenden (verschiedene Versionen mit mehreren Argumenten), ist zip nicht mehr die eigene Umkehrung. Um das
zip(*[...])
Idiom von Python nachzuahmen , müssen Sie dies tun,zip.apply(this, [...])
wenn Sie die Zip-Funktion invertieren möchten oder wenn Sie auf ähnliche Weise eine variable Anzahl von Listen als Eingabe haben möchten.Nachtrag :
Um dieses Handle iterierbar zu machen (z. B. in Python, das Sie
zip
für Zeichenfolgen, Bereiche, Kartenobjekte usw. verwenden können), können Sie Folgendes definieren:Allerdings , wenn Sie schreiben
zip
in der folgenden Art und Weise , auch das wird nicht nötig sein:Demo:
(Oder Sie können eine
range(...)
Funktion im Python-Stil verwenden, wenn Sie bereits eine geschrieben haben. Schließlich können Sie ECMAScript-Array-Verständnis oder -Generatoren verwenden.)quelle
zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]));
zip(zip(x)) = x
, aber Sie können sich trotzdem auf das Vertrauen verlassen, dasszip(...zip(...x)) = x
.const the_longest_array_length = Math.max(...(arrays.map(array => array.length)));
Überprüfen Sie die Bibliothek Unterstrich .
- Sagen Sie die Leute, die es geschafft haben
Ich habe vor kurzem angefangen, es speziell für die
zip()
Funktion zu verwenden, und es hat einen großartigen ersten Eindruck hinterlassen. Ich benutze jQuery und CoffeeScript und es passt einfach perfekt zu ihnen. Der Unterstrich setzt genau dort an, wo er aufgehört hat, und hat mich bisher nicht enttäuscht. Ach übrigens, es ist nur 3kb minimiert.Hör zu:
quelle
Zusätzlich zu Ninjageckos hervorragender und umfassender Antwort reicht es aus, zwei JS-Arrays zu einem "Tupel-Mimic" zu komprimieren:
Erläuterung:
Da Javascript keinen
tuples
Typ hat, hatten Funktionen für Tupel, Listen und Mengen in der Sprachspezifikation keine hohe Priorität.Andernfalls ist ein ähnliches Verhalten auf einfache Weise über die Array-Zuordnung in JS> 1.6 zugänglich . (
map
wird tatsächlich oft von JS-Motorenherstellern in vielen> JS 1.4-Motoren implementiert, obwohl nicht angegeben).Der wesentliche Unterschied zu Python
zip
,izip
... Ergebnisse vonmap
‚funktionalem Stil, damap
erfordert ein funktions Argument. Zusätzlich ist es eine Funktion derArray
-instance. Man kannArray.prototype.map
stattdessen verwenden, wenn eine zusätzliche Deklaration für die Eingabe ein Problem darstellt.Beispiel:
Ergebnis:
Verwandte Leistung:
Verwenden von
map
Over-for
Loops:Siehe: Was ist der effizienteste Weg, um [1,2] und [7,8] zu [[1,7], [2,8]] zusammenzuführen?
Hinweis: Die Basistypen wie
false
undundefined
besitzen keine prototypische Objekthierarchie und machen daher keinetoString
Funktion verfügbar . Daher werden diese in der Ausgabe als leer angezeigt.Da
parseInt
das zweite Argument der Basis- / Zahlenradix ist, in den die Zahl konvertiert werden soll, und damap
der Index als zweites Argument an seine Argumentfunktion übergeben wird, wird eine Wrapperfunktion verwendet.quelle
aIn.map(function(e, i) {return [e, aOut[i]];})
Was ist falsch?Array.prototype.map
hätteArray.prototype.map.call
die Antwort korrigieren sollen .Modernes ES6-Beispiel mit Generator:
Zuerst erhalten wir eine Liste von Iterables als
iterators
. Dies geschieht normalerweise transparent, aber hier tun wir es explizit, da wir Schritt für Schritt nachgeben, bis einer von ihnen erschöpft ist. Wir prüfen, ob eines der Ergebnisse (mit der.some()
Methode) im angegebenen Array erschöpft ist, und wenn ja, unterbrechen wir die while-Schleife.quelle
Bietet neben anderen Python-ähnlichen Funktionen
pythonic
einezip
Funktion mit dem zusätzlichen Vorteil, dass eine verzögerte Auswertung zurückgegeben wirdIterator
, ähnlich dem Verhalten des Python-Gegenstücks :Offenlegung Ich bin Autor und Betreuer von Pythonic
quelle
Der Python hat zwei Funktionen: zip und itertools.zip_longest. Die Implementierung unter JS / ES6 sieht folgendermaßen aus:
Implementierung Pythons Zip unter JS / ES6
Ergebnisse:
Implementierung Pythons zip_longest unter JS / ES6
( https://docs.python.org/3.5/library/itertools.html?highlight=zip_longest#itertools.zip_longest )
Ergebnisse:
quelle
Sie können die Dienstprogrammfunktion mithilfe von ES6 aktivieren.
In der obigen Lösung definiert die Länge des ersten Arrays jedoch die Länge des Ausgabearrays.
Hier ist die Lösung, bei der Sie mehr Kontrolle darüber haben. Es ist etwas komplex, aber es lohnt sich.
quelle
1. Npm-Modul:
zip-array
Ich habe ein npm-Modul gefunden, das als Javascript-Version von Python verwendet werden kann
zip
:zip-array - Ein Javascript-Äquivalent zur Zip-Funktion von Python. Fügt die Werte der einzelnen Arrays zusammen.
https://www.npmjs.com/package/zip-array
2.
tf.data.zip()
in Tensorflow.jsEine andere alternative Option ist für Benutzer von Tensorflow.js: Wenn Sie eine
zip
Funktion in Python benötigen , um mit Tensorflow-Datasets in Javascript zu arbeiten, können Sie diesetf.data.zip()
in Tensorflow.js verwenden.tf.data.zip () in Tensorflow.js dokumentiert an hier
quelle
Nicht in Javascript selbst integriert. Einige der gängigen Javascript-Frameworks (z. B. Prototype) bieten eine Implementierung, oder Sie können Ihre eigene schreiben.
quelle
Wie @Brandon, empfehle ich Unders ‚s Zip - Funktion. Es funktioniert jedoch so
zip_longest
,undefined
als würden Werte nach Bedarf angehängt , um etwas mit der Länge der längsten Eingabe zurückzugeben.Ich habe die
mixin
Methode verwendet, um den Unterstrich mit einem zu erweiternzipShortest
, der sich wie Pythons verhältzip
und auf der eigenen Quelle der Bibliothek fürzip
basiert .Sie können Ihrem allgemeinen JS-Code Folgendes hinzufügen und ihn dann so aufrufen, als wäre er Teil des Unterstrichs:
_.zipShortest([1,2,3], ['a'])
Gibt[[1, 'a']]
beispielsweise zurück.quelle
Sie können das Array von Arrays reduzieren und ein neues Array zuordnen, indem Sie das Ergebnis des Index des inneren Arrays verwenden.
quelle
Eine Variation der Lazy Generator-Lösung :
Und dies ist die klassische "n-Gruppe" -Sprache der Python
zip(*[iter(a)]*n)
:quelle
Die Mochikit- Bibliothek bietet diese und viele andere Python-ähnliche Funktionen. Der Entwickler von Mochikit ist auch ein Python-Fan, hat also den allgemeinen Stil von Python und verpackt die asynchronen Aufrufe in ein verdrehtes Framework.
quelle
Ich habe dies in reinem JS versucht und mich gefragt, wie die oben veröffentlichten Plugins den Job erledigt haben. Hier ist mein Ergebnis. Ich werde dies vorwegnehmen, indem ich sage, dass ich keine Ahnung habe, wie stabil dies im IE und dergleichen sein wird. Es ist nur ein kurzes Modell.
Es ist nicht kugelsicher, aber es ist immer noch interessant.
quelle
console.log
zualert
.document.write()
jsfiddle.net/PyTWw/5Dies spart eine Linie von Ddis iteratorbasierter Antwort:
quelle
Wenn Sie mit ES6 gut zurechtkommen:
quelle