Feature #5133

Array#unzip as an alias of Array#transpose

Added by Kenta Murata over 2 years ago. Updated over 1 year ago.

[ruby-dev:44304]
Status:Assigned
Priority:Normal
Assignee:Kenta Murata
Category:core
Target version:next minor

Description

Array#zip の逆は Array#transpose なんですけど、
この対応関係が非常に分かり難いなと思いました。

Haskell には zip の逆をやる関数として unzip が用意されています。
unzip という名前は、「zip の逆をやりたい」と思ったときに
(transpose よりは) 思い付きやすい名前だと思います。

ということで Array#unzip を Array#transpose のエイリアスとして
導入してはどうでしょう?

以下パッチです:

diff --git a/array.c b/array.c
index 8caad66..dc411b7 100644
--- a/array.c
+++ b/array.c
@@ -4720,6 +4720,7 @@ InitArray(void)
rb
definemethod(rbcArray, "reject!", rbaryrejectbang, 0);
rb
definemethod(rbcArray, "zip", rbaryzip, -1);
rbdefinemethod(rbcArray, "transpose", rbarytranspose, 0);
+ rb
definealias(rbcArray, "unzip", "transpose");
rbdefinemethod(rbcArray, "replace", rbaryreplace, 1);
rb
definemethod(rbcArray, "clear", rbaryclear, 0);
rbdefinemethod(rbcArray, "fill", rbary_fill, -1);

History

#1 Updated by Kazuhiro NISHIYAMA over 2 years ago

逆とはどういう動作のことを言っていますか?

Array#zip が複数の配列から1つの配列を返す(かブロックを受け取ると別の動作)で、
Array#transpose が1つの配列から1つの配列を返す(ブロックは受け取らない)ということから
逆という印象は受けなかったので、逆というだけの説明だとよくわかりませんでした。

#2 Updated by Makoto Kishimoto over 2 years ago

きしもとです

[1, 2, 3, 4] と ["a", "b", "c", "d"] から、
[[1, "a"], [2, "b"], [3, "c"], [4, "d"]] を作るのが zip で、

irb> [1, 2, 3, 4].zip ["a", "b", "c", "d"]
=> [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]

[[1, "a"], [2, "b"], [3, "c"], [4, "d"]] を transpose すると、
[[1, 2, 3, 4], ["a", "b", "c", "d"]] が得られるわけですが、

irb> [[1, "a"], [2, "b"], [3, "c"], [4, "d"]].transpose
=> [[1, 2, 3, 4], ["a", "b", "c", "d"]]

なんとなく、たまたま、という気がします。

transpose は自己双対で、zip と双対というわけでもないので、
エイリアスには反対、かなぁ。
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]].transpose に対応するものって
# zip で簡単にできましたっけ?

というわけで、ドキュメント等にわかりやすく書いておくことについては
賛成します。

#3 Updated by Yui NARUSE over 2 years ago

(2011/08/01 20:54), KISHIMOTO, Makoto wrote:

transpose は自己双対で、zip と双対というわけでもないので、
エイリアスには反対、かなぁ。

[[1, 2, 3], [4, 5, 6], [7, 8, 9]].transpose に対応するものって

zip で簡単にできましたっけ?

irb(main):001:0> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]].transpose
=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
irb(main):002:0> a.zip
=> [1, 4, 7, 2, 5, 8, 3, 6, 9]
irb(main):003:0> a[0].zip(*a[1,2])
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ですね。
簡単っちゃ簡単だけど、ちょっと軸はずれてますね

--
NARUSE, Yui naruse@airemix.jp

#4 Updated by Kenta Murata over 2 years ago

「zip が transpose の逆になっているか」
を確認せず投稿したことがバレてしまいましたね。

私が欲しかったのは unzip のような zip の逆っぽいイメージの名前が付いている、
zip する前の配列のセットが返ってくるメソッドです。

きしもとさんの

transpose は自己双対で、zip と双対というわけでもないので、
エイリアスには反対、かなぁ。

という意見については、確かにその通りだと思いましたので、
エイリアスではない方法で導入できるなら嬉しいです。

#5 Updated by Shyouhei Urabe about 2 years ago

  • Status changed from Open to Assigned

#6 Updated by Koichi Sasada over 1 year ago

  • Assignee changed from Yukihiro Matsumoto to Kenta Murata
  • Target version changed from 2.0.0 to next minor

ええと,まつもとさんアサインで進むのだろうか?
mrkn さんがまつもとさんを説得して,next minor から 2.0 に戻して下さい.

Also available in: Atom PDF