Jump to content

Зиппинг (информатика)

В информатике , сжатие это функция которая отображает кортеж последовательностей в последовательность кортежей . — Это название «zip» происходит от действия застежки -молнии, заключающейся в том, что она чередует две ранее непересекающиеся последовательности. Обратная функция — unzip .

Учитывая три слова кот , рыба и быть где | кот | 3, | рыба | равно 4 и | быть | равно 2. Пусть обозначают длину самого длинного слова — « рыба» ; . Тогда молния cat , fish , be состоит из 4 кортежей элементов:

где # — символ, отсутствующий в исходном алфавите. В Haskell это усекается до кратчайшей последовательности. , где :

zip3 "cat" "fish" "be"
-- [('c','f','b'),('a','i','e')]

Определение

[ редактировать ]

Пусть Σ — алфавит , # ​​— символ, не входящий в Σ.

Пусть х 1 х 2 ... х | х | , y 1 y 2 ... y | й | , z 1 z 2 ... z | г | , ... быть n словами (т.е. конечными последовательностями ) элементов из Σ. Позволять обозначают длину самого длинного слова, т.е. максимум | х |, | й |, | з |, ... .

Почтовый индекс этих слов представляет собой конечную последовательность n -кортежей элементов (Σ ∪ {#}) , т. е. элемент :

,

где для любого индекса i > | ш | , w i — это #.

Почтовый индекс x, y, z, ... обозначается zip( x, y, z, ... ) или x y z ⋆ ...

Обратное к zip иногда обозначается как unzip.

Вариант операции zip определяется:

где минимальная длина входных слов. Это позволяет избежать использования присоединенного элемента , но уничтожает информацию об элементах входных последовательностей за пределами .

В языках программирования

[ редактировать ]

Zip Функции часто доступны в языках программирования , их часто называют почтовый индекс . В диалектах Lisp можно просто сопоставить нужную функцию с нужными списками, В Лиспе карта является вариативной , поэтому в качестве аргумента может принимать произвольное количество списков. Пример из Clojure : [1]

;; `nums' contains an infinite list of numbers (0 1 2 3 ...)
(def nums (range))
(def tens [10 20 30])
(def firstname "Alice")

;; To zip (0 1 2 3 ...) and [10 20 30] into a vector, invoke `map vector' on them; same with list
(map vector nums tens)           ; ⇒ ([0 10] [1 20] [2 30])
(map list nums tens)             ; ⇒ ((0 10) (1 20) (2 30))
(map str nums tens)              ; ⇒ ("010" "120" "230")

;; `map' truncates to the shortest sequence; note missing \c and \e from "Alice"
(map vector nums tens firstname) ; ⇒ ([0 10 \A] [1 20 \l] [2 30 \i])
(map str nums tens firstname)    ; ⇒ ("010A" "120l" "230i")

;; To unzip, apply `map vector' or `map list'
(apply map list (map vector nums tens firstname))
;; ⇒ ((0 1 2) (10 20 30) (\A \l \i))

В Общем Лиспе :

(defparameter nums '(1 2 3))
(defparameter tens '(10 20 30))
(defparameter firstname "Alice")

(mapcar #'list nums tens)
;; ⇒ ((1 10) (2 20) (3 30))

(mapcar #'list nums tens (coerce firstname 'list))
;; ⇒ ((1 10 #\A) (2 20 #\l) (3 30 #\i)) — truncates on shortest list

;; Unzips
(apply #'mapcar #'list (mapcar #'list nums tens (coerce firstname 'list)))
;; ⇒ ((1 2 3) (10 20 30) (#\A #\l #\i))

Такие языки, как Python, предоставляют функция zip() . [2] zip() в сочетании с * оператор разархивирует список: [2]

>>> nums = [1, 2, 3]
>>> tens = [10, 20, 30]
>>> firstname = 'Alice'

>>> zipped = list(zip(nums, tens))
>>> zipped
[(1, 10), (2, 20), (3, 30)]

>>> list(zip(*zipped)) # unzip
[(1, 2, 3), (10, 20, 30)]

>>> zipped2 = list(zip(nums, tens, list(firstname)))
>>> zipped2 # zip, truncates on shortest
[(1, 10, 'A'), (2, 20, 'l'), (3, 30, 'i')] 
>>> list(zip(*zipped2)) # unzip
[(1, 2, 3), (10, 20, 30), ('A', 'l', 'i')]

В Haskell есть метод архивирования последовательностей, но для каждой арности требуется определенная функция ( zip для двух последовательностей, zip3 на троих и т. д.), [3] аналогично функции разархивируйте и unzip3 доступны для распаковки:

-- nums contains an infinite list of numbers [1, 2, 3, ...] 
nums = [1..]
tens = [10, 20, 30]
firstname = "Alice"

zip nums tens
-- ⇒ [(1,10), (2,20), (3,30)] — zip, truncates infinite list
unzip $ zip nums tens
-- ⇒ ([1,2,3], [10,20,30]) — unzip

zip3 nums tens firstname
-- ⇒ [(1,10,'A'), (2,20,'l'), (3,30,'i')] — zip, truncates
unzip3 $ zip3 nums tens firstname
-- ⇒ ([1,2,3], [10,20,30], "Ali") — unzip

Сравнение языков

[ редактировать ]

Список языков с поддержкой zip:

Почтовый индекс на разных языках
Язык Почтовый индекс Заархивировать 3 списка Заархивировать списки Примечания
Часовня zip ( итер1 итер2 ) zip ( iter1 iter2 iter3 ) zip ( iter1 ... itern ) Форма каждого итератора, ранг и экстенты в каждом измерении должны быть идентичными. [4]
Кложур (список карт list1 list2 )
(вектор карты list1 list2 )
(список карт list1 list2 list3 )
(вектор карты list1 list2 list3 )
(список карт list1 listn )
(вектор карты list1 слушайте )
Останавливается после длины самого короткого списка.
Общий Лисп (mapcar #'list list1 list2) (mapcar #'list list1 list2 list3) (mapcar #'list list1 ... listn) Останавливается после длины самого короткого списка.
Д zip( диапазон1 , диапазон2 )
диапазон1 .zip( диапазон2 )
zip( диапазон1 , диапазон2 , диапазон3 )
диапазон1 .zip(диапазон2, диапазон3)
zip( диапазон1 , …, диапазонN )
диапазон1 .zip(…, диапазонN)
Политика остановки по умолчанию является самой короткой и может быть дополнительно указана как самая короткая, самая длинная или требующая одинаковой длины. [5] Вторая форма является примером UFCS .
Ф# Список.zip список1 список2
Seq.zip источник1 источник2
Array.zip массив1 массив2
Список.zip3 список1 список2 список3
Seq.zip3 исходный1 исходный2 исходный3
Array.zip3 массив1 массив2 массив3
Хаскелл zip- лист1 список2 zip3 список1 список2 список3 zip n list1 слушать zipn для n > 3 доступен в модуле Data.List . Останавливается после того, как заканчивается кратчайший список.
Питон zip( список1 , список2 ) zip( список1 , список2 , список3 ) zip( список1 , …, прослушать ) zip() и map() (3.x) останавливается после того, как заканчивается кратчайший список, тогда как карта() (2.x) и itertools.zip_longest() (3.x) расширяет более короткие списки с помощью Нет предметов
Руби список1 .zip( список2 ) список1 .zip( список2 , список3 ) список1 .zip( список1 , .., списокn ) Если список, который выполняется (список1), короче, чем списки, которые архивируются, результирующий список имеет длину списка1. Если список1 длиннее, для заполнения недостающих значений используются нулевые значения. [6]
Скала список1 .zip( список2 ) Если одна из двух коллекций длиннее другой, остальные ее элементы игнорируются. [7]
Разархивировать на разных языках
Язык Разархивировать Разархивируйте 3 кортежа Разархивируйте n кортежей Примечания
Кложур (применить векторный zip-лист карты ) (применить векторный zip-лист карты ) (применить векторный zip-лист карты )
Общий Лисп (apply #'mapcar #'list ziplist) (apply #'mapcar #'list ziplist) (apply #'mapcar #'list ziplist)
Ф# List.unzip список1 список2
Seq.unzip источник1 источник2
Array.unzip массив1 массив2
List.unzip3 список1 список2 список3
Seq.unzip3 исходный1 исходный2 исходный3
Array.unzip3 массив1 массив2 массив3
Хаскелл разархивировать почтовый список распаковать 3 zip-листа разархивировать и заархивировать список unzipn для n > 3 доступен в модуле Данные.Список .
Питон zip(* zipvlist ) zip(* zipvlist ) zip(* zipvlist )

См. также

[ редактировать ]
  1. ^ карта из ClojureDocs
  2. ^ Перейти обратно: а б map(function, iterable, ...) из раздела Встроенные функции документации Python v2.7.2
  3. ^ zip :: [a] -> [b] -> [(a, b)] из Prelude, Базовые библиотеки
  4. ^ «Заявления — Документация Часовни 1.25» .
  5. ^ «std.range — язык программирования D» .
  6. ^ «Класс: Массив (Ruby 2.0.0)» .
  7. ^ «ИтераблеОпс» . scala-lang.org .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: e4733802537a3367dcc1bf6b4432258c__1708382100
URL1:https://arc.ask3.ru/arc/aa/e4/8c/e4733802537a3367dcc1bf6b4432258c.html
Заголовок, (Title) документа по адресу, URL1:
Zipping (computer science) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)