Для этого ответа требуется dash
библиотека для обработки списка. Прежде чем атаковать вашу проблему, хорошо, чтобы найти длину самого длинного списка. Первый способ я придумал это:
(require 'dash)
(require 'dash-functional)
(length (-max-by (-on '> 'length) (list x y))) ; 4
-on
является смарт-функция из пакета dash-functional
, который принимает компаратор, ключ, на котором для сравнения, и возвращает функцию, которая сравнивает по этому ключу. Поэтому (-max-by (-on '> 'length) xs)
находит элемент в xs
, чья длина является самой большой. Но это выражение слишком умно для себя, и dash-functional
работает только в Emacs 24 из-за лексического охвата. Давайте перепишем его, вдохновленный Python solution:
(-max (-map 'length (list x y))) ; 4
принять первые n
элементы из бесконечного cycled списка, сделайте (-take n (-cycle xs))
. Поэтому, чтобы создать ассоциативный список, в котором элементы из меньшего списка циклически, написать:
(let ((len (-max (-map 'length (list x y)))))
(flet ((cycle (xs) (-take len (-cycle xs))))
(-zip (cycle x) (cycle y)))) ; (("a" . "1") ("b" . "2") ("c" . "3") ("a" . "4"))
Я действительно думал, что круговой список был полезен в этом случае; он не превращается ... – RNA