たとえば
((1 2 3) (4 5 6) (7 8 9))
を
((1 4 7) (2 5 8) (3 6 9))
という風に縦横を変換したい。
パッと考えて二重ループで……とごちゃごちゃ考えたのだけれど、面倒臭い。きっとどこかにありそうだ。elisp、CommonLisp関連でググってもなかなか、見つからず、きっと名前に「tranpose」が入っているにちがいない、と考えてEmacsの「describe-function」で見つけた。
(slime-transpose-lists LIST-OF-LISTS) Not documented.
まさにこれ。ソースを見たら
( defun slime-transpose-lists (list-of-lists) ( let ((ncols (length (car list-of-lists)))) ( cl-loop for col-index below ncols collect ( cl-loop for row in list-of-lists collect (elt row col-index)))))
やはり二重ループ。
それでもLispだとたったこれだけの行数で書ける。
というか、簡単に書けてしまうから標準でなかったのかも。