Forum: Ruby-dev [Ruby 1.9 - Feature #5133][Open] Array#unzip as an alias of Array#transpose

7cca11c5257fda526eeb4b1ada28f904?d=identicon&s=25 Kenta Murata (Guest)
on 2011-08-01 11:30
(Received via mailing list)
Issue #5133 has been reported by Kenta Murata.

----------------------------------------
Feature #5133: Array#unzip as an alias of Array#transpose
http://redmine.ruby-lang.org/issues/5133

Author: Kenta Murata
Status: Open
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 1.9.x


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 @@ Init_Array(void)
     rb_define_method(rb_cArray, "reject!", rb_ary_reject_bang, 0);
     rb_define_method(rb_cArray, "zip", rb_ary_zip, -1);
     rb_define_method(rb_cArray, "transpose", rb_ary_transpose, 0);
+    rb_define_alias(rb_cArray, "unzip", "transpose");
     rb_define_method(rb_cArray, "replace", rb_ary_replace, 1);
     rb_define_method(rb_cArray, "clear", rb_ary_clear, 0);
     rb_define_method(rb_cArray, "fill", rb_ary_fill, -1);
C4e88907313843cf07f6d85ba8162120?d=identicon&s=25 Kazuhiro NISHIYAMA (Guest)
on 2011-08-01 12:09
(Received via mailing list)
Issue #5133 has been updated by Kazuhiro NISHIYAMA.


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

Array#zip が複数の配列から1つの配列を返す(かブロックを受け取ると別の動作)で、
Array#transpose が1つの配列から1つの配列を返す(ブロックは受け取らない)ということから
逆という印象は受けなかったので、逆というだけの説明だとよくわかりませんでした。
----------------------------------------
Feature #5133: Array#unzip as an alias of Array#transpose
http://redmine.ruby-lang.org/issues/5133

Author: Kenta Murata
Status: Open
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 1.9.x


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 @@ Init_Array(void)
     rb_define_method(rb_cArray, "reject!", rb_ary_reject_bang, 0);
     rb_define_method(rb_cArray, "zip", rb_ary_zip, -1);
     rb_define_method(rb_cArray, "transpose", rb_ary_transpose, 0);
+    rb_define_alias(rb_cArray, "unzip", "transpose");
     rb_define_method(rb_cArray, "replace", rb_ary_replace, 1);
     rb_define_method(rb_cArray, "clear", rb_ary_clear, 0);
     rb_define_method(rb_cArray, "fill", rb_ary_fill, -1);
A6ec6dca2b2870853cd891b92fd95e15?d=identicon&s=25 KISHIMOTO, Makoto (Guest)
on 2011-08-01 13:55
(Received via mailing list)
$B$-$7$b$H$G$9(B

[1, 2, 3, 4] $B$H(B ["a", "b", "c", "d"] $B$+$i!"(B
[[1, "a"], [2, "b"], [3, "c"], [4, "d"]] $B$r:n$k$N$,(B zip $B$G!"(B

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"]] $B$r(B transpose $B$9$k$H!"(B
[[1, 2, 3, 4], ["a", "b", "c", "d"]] $B$,F@$i$l$k$o$1$G$9$,!"(B

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

$B$J$s$H$J$/!"$?$^$?$^!"$H$$$&5$$,$7$^$9!#(B

transpose $B$O<+8JAPBP$G!"(Bzip $B$HAPBP$H$$$&$o$1$G$b$J$$$N$G!"(B
$B%(%$%j%"%9$K$OH?BP!"$+$J$!!#(B
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]].transpose $B$KBP1~$9$k$b$N$C$F(B
# zip $B$G4JC1$K$G$-$^$7$?$C$1!)(B

$B$H$$$&$o$1$G!"%I%-%e%a%s%HEy$K$o$+$j$d$9$/=q$$$F$*$/$3$H$K$D$$$F$O(B
$B;?@.$7$^$9!#(B
9361878d459f1709feec780518946ee5?d=identicon&s=25 NARUSE, Yui (Guest)
on 2011-08-01 15:44
(Received via mailing list)
(2011/08/01 20:54), KISHIMOTO, Makoto wrote:
> transpose $B$O<+8JAPBP$G!"(Bzip $B$HAPBP$H$$$&$o$1$G$b$J$$$N$G!"(B
> $B%(%$%j%"%9$K$OH?BP!"$+$J$!!#(B
> # [[1, 2, 3], [4, 5, 6], [7, 8, 9]].transpose $B$KBP1~$9$k$b$N$C$F(B
> # zip $B$G4JC1$K$G$-$^$7$?$C$1!)(B

irb(main):001:0> a$B!!(B= [[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]]

$B$G$9$M!#(B
$B4JC1$C$A$c4JC1$@$1$I!"$A$g$C$H<4$O$:$l$F$^$9$M(B
7cca11c5257fda526eeb4b1ada28f904?d=identicon&s=25 Kenta Murata (Guest)
on 2011-08-01 16:35
(Received via mailing list)
Issue #5133 has been updated by Kenta Murata.


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

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

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

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

----------------------------------------
Feature #5133: Array#unzip as an alias of Array#transpose
http://redmine.ruby-lang.org/issues/5133

Author: Kenta Murata
Status: Open
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 1.9.x


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 @@ Init_Array(void)
     rb_define_method(rb_cArray, "reject!", rb_ary_reject_bang, 0);
     rb_define_method(rb_cArray, "zip", rb_ary_zip, -1);
     rb_define_method(rb_cArray, "transpose", rb_ary_transpose, 0);
+    rb_define_alias(rb_cArray, "unzip", "transpose");
     rb_define_method(rb_cArray, "replace", rb_ary_replace, 1);
     rb_define_method(rb_cArray, "clear", rb_ary_clear, 0);
     rb_define_method(rb_cArray, "fill", rb_ary_fill, -1);
C4e88907313843cf07f6d85ba8162120?d=identicon&s=25 ko1 (Koichi Sasada) (Guest)
on 2012-10-26 23:18
(Received via mailing list)
Issue #5133 has been updated by ko1 (Koichi Sasada).

Assignee changed from matz (Yukihiro Matsumoto) to mrkn (Kenta Murata)
Target version changed from 2.0.0 to next minor

ええと,まつもとさんアサインで進むのだろうか?
mrkn さんがまつもとさんを説得して,next minor から 2.0 に戻して下さい.
----------------------------------------
Feature #5133: Array#unzip as an alias of Array#transpose
https://bugs.ruby-lang.org/issues/5133#change-31667

Author: mrkn (Kenta Murata)
Status: Assigned
Priority: Normal
Assignee: mrkn (Kenta Murata)
Category: core
Target version: next minor


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 @@ Init_Array(void)
     rb_define_method(rb_cArray, "reject!", rb_ary_reject_bang, 0);
     rb_define_method(rb_cArray, "zip", rb_ary_zip, -1);
     rb_define_method(rb_cArray, "transpose", rb_ary_transpose, 0);
+    rb_define_alias(rb_cArray, "unzip", "transpose");
     rb_define_method(rb_cArray, "replace", rb_ary_replace, 1);
     rb_define_method(rb_cArray, "clear", rb_ary_clear, 0);
     rb_define_method(rb_cArray, "fill", rb_ary_fill, -1);
This topic is locked and can not be replied to.