Есть ли javascript-эквивалент функции zip в Python? То есть, учитывая несколько массивов одинаковой длины, создайте массив пар.
Например, если у меня есть три массива, которые выглядят так:
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]]
forEach
,reduce
,map
,every
и т.д. Это был как раз тот случай , чтоzip
«не делают разрез» (аflatMap
также отсутствует), а не из соображений производительности - но честно говоря, в .NET (3.5) не было Zip на Enumerable в течение пары лет! Любая «функциональная» библиотека, такая как underscore / lodash (lodash 3.x имеет ленивую оценку последовательности), предоставит эквивалентную функцию zip.Ответы:
Обновление 2016 года:
Вот забавная версия Ecmascript 6:
Иллюстрация эквив. на Python {
zip(*args)
}:(и FizzyTea указывает, что ES6 имеет синтаксис с переменным аргументом, поэтому следующее определение функции будет действовать как python, но см. ниже заявление об отказе от ответственности ... это не будет его собственным обратным, поэтому
zip(zip(x))
не будет равнымx
; хотя, как указывает Мэтт Крамерzip(...zip(...x))==x
(например, в штатном питонеzip(*zip(*x))==x
))Альтернативное определение эквив. на Python {
zip
}:(Обратите внимание, что у
...
синтаксиса могут быть проблемы с производительностью в настоящее время и, возможно, в будущем, поэтому, если вы используете второй ответ с переменными аргументами, вы можете захотеть его протестировать.)Вот один вкладыш:
Выше предполагается, что массивы имеют одинаковый размер, как и должно быть. Также предполагается, что вы передаете один аргумент list списков, в отличие от версии Python, где список аргументов является вариативным. Если вы хотите все эти «функции», см. Ниже. Это займет всего около 2 дополнительных строк кода.
Следующее будет имитировать
zip
поведение Python в крайних случаях, когда массивы не имеют одинаковый размер, молча притворяясь, что более длинные части массивов не существуют:Это будет имитировать
itertools.zip_longest
поведение Python , вставляяundefined
туда , где массивы не определены:Если вы используете эти две последние версии (variadic, то есть версии с несколькими аргументами), то zip больше не является своей обратной. Чтобы имитировать
zip(*[...])
идиому из Python, вам нужно будет это сделать,zip.apply(this, [...])
если вы хотите инвертировать функцию zip или если вы хотите, чтобы аналогичным образом было переменное количество списков в качестве входных данных.приложение :
Чтобы сделать этот дескриптор итеративным (например, в Python, который вы можете использовать
zip
для строк, диапазонов, объектов карты и т. Д.), Вы можете определить следующее:Однако, если вы пишете
zip
следующим образом , даже в этом нет необходимости:Демо-версия:
(Или вы можете использовать функцию в
range(...)
стиле Python, если вы ее уже написали. В конце концов вы сможете использовать массивы или генераторы ECMAScript.)источник
zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]));
zip(zip(x)) = x
, вы все равно можете быть уверены в этомzip(...zip(...x)) = x
.const the_longest_array_length = Math.max(...(arrays.map(array => array.length)));
Проверьте библиотеку Underscore .
- Скажите люди, которые сделали это
Я недавно начал использовать его специально для этой
zip()
функции, и это оставило отличное первое впечатление. Я использую JQuery и CoffeeScript, и это просто отлично с ними. Подчеркивание начинается там, где они заканчиваются, и до сих пор меня это не подводило. О, кстати, это только 3kb минимизировано.Проверьте это:
источник
В дополнение к превосходному и исчерпывающему ответу ninjagecko, все, что нужно, чтобы заархивировать два JS-массива в «кортеж-имитатор», это:
Объяснение:
Поскольку у Javascript нет
tuples
типа, функции для кортежей, списков и наборов не были приоритетными в спецификации языка.В противном случае подобное поведение доступно простым способом через карту массива в JS> 1.6 . (
map
фактически часто применяется производителями двигателей JS во многих> JS 1.4 двигателях, несмотря на то, что не указано).Основное отличие в Питон
zip
,izip
... Результатыmap
функционального стиля «S, так какmap
требует функцию-аргумента. Кроме того, это функцияArray
экземпляра.Array.prototype.map
Вместо этого можно использовать , если дополнительная декларация для ввода является проблемой.Пример:
Результат:
Связанная производительность:
Использование
map
болееfor
-loops:См .: Какой самый эффективный способ объединения [1,2] и [7,8] в [[1,7], [2,8]]
Примечание: базовые типы, такие как
false
иundefined
не обладают прототипной иерархией объектов и, следовательно, не предоставляютtoString
функции. Следовательно, они показаны как пустые в выходных данных.Поскольку
parseInt
вторым аргументом является основание / число основание, в которое нужно преобразовать число, и, посколькуmap
индекс передает его в качестве второго аргумента своей функции-аргумента, используется функция-обертка.источник
aIn.map(function(e, i) {return [e, aOut[i]];})
что не так?Array.prototype.map
должно бытьArray.prototype.map.call
, исправил ответ.Современный пример ES6 с генератором:
Сначала мы получаем список итераций как
iterators
. Обычно это происходит прозрачно, но здесь мы делаем это явно, поскольку мы уступаем шаг за шагом, пока один из них не будет исчерпан. Мы проверяем,.some()
исчерпан ли какой-либо из результатов (используя метод) в данном массиве, и если это так, мы прерываем цикл while.источник
Наряду с другими Python-подобными функциями,
pythonic
предлагаетzip
функцию с дополнительным преимуществом возврата вычисленной ленивостиIterator
, аналогично поведению ее аналога Python :Раскрытие Я автор и сопровождающий Pythonic
источник
Питон имеет две функции: zip и itertools.zip_longest. Реализация на JS / ES6 выглядит так:
Реализация Python`s Zip на JS / ES6
Полученные результаты:
Реализация Python's zip_longest на JS / ES6
( https://docs.python.org/3.5/library/itertools.html?highlight=zip_longest#itertools.zip_longest )
Полученные результаты:
источник
Вы можете сделать функцию полезности с помощью ES6.
Однако в приведенном выше решении длина первого массива определяет длину выходного массива.
Вот решение, в котором у вас есть больше контроля над ним. Это немного сложно, но оно того стоит.
источник
1. Модуль Npm:
zip-array
Я нашел модуль npm, который можно использовать как версию Python для JavaScript
zip
:zip-array - javascript-эквивалент функции zip в Python. Объединяет значения каждого из массивов.
https://www.npmjs.com/package/zip-array
2.
tf.data.zip()
в Tensorflow.jsДругой альтернативный выбор для пользователей Tensorflow.js: если вам нужна
zip
функция в python для работы с наборами данных tenorflow в Javascript, вы можете использоватьtf.data.zip()
в Tensorflow.js.tf.data.zip () в Tensorflow.js задокументирован здесь
источник
Не встроен в сам Javascript. Некоторые из распространенных структур Javascript (например, Prototype) предоставляют реализацию, или вы можете написать свою собственную.
источник
Как @Brandon, я рекомендую Underscore «сек зип функцию. Тем не менее, он действует как
zip_longest
добавлениеundefined
значений по мере необходимости, чтобы возвращать что-то длиной самого длинного ввода.Я использовал
mixin
метод для расширения подчеркивания с помощью azipShortest
, который действует как Pythonzip
, основанный на собственном источнике библиотекиzip
.Вы можете добавить следующее к вашему общему JS-коду и затем вызвать его, как если бы оно было частью подчеркивания: например,
_.zipShortest([1,2,3], ['a'])
возвращает[[1, 'a']]
.источник
Вы можете уменьшить массив массивов и отобразить новый массив, взяв результат индекса внутреннего массива.
источник
Вариант решения ленивого генератора :
И это классическая идиома питона "n-group"
zip(*[iter(a)]*n)
:источник
Библиотека Mochikit предоставляет эту и многие другие функции, подобные Python. Разработчик Mochikit также является поклонником Python, поэтому он имеет общий стиль Python, а также обертывает асинхронные вызовы в скрученной среде.
источник
Я попробовал это на чистом JS, задаваясь вопросом, как плагины, размещенные выше, сделали свою работу. Вот мой результат. Я предвосхищу это, говоря, что я понятия не имею, насколько стабильно это будет в IE и т.п. Это просто быстрый макет.
Это не пуленепробиваемый, но все же интересно.
источник
console.log
наalert
.document.write()
jsfiddle.net/PyTWw/5Это сбивает строку с ответа Ddi на основе итератора:
источник
Если вы в порядке с ES6:
источник