digitalmars.D.bugs - [Issue 6004] New: std.range.unzip()
- d-bugmail puremagic.com (54/63) May 15 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6004
http://d.puremagic.com/issues/show_bug.cgi?id=6004
Summary: std.range.unzip()
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: Phobos
AssignedTo: nobody puremagic.com
ReportedBy: bearophile_hugs eml.cc
In Python and Haskell there is a way to invert the operation of zip(), this is
a commonly used feature/function:
Python (V2.6.6):
s = "abc"
d = [1, 2, 3]
z = zip(s, d)
z
[('a', 1), ('b', 2), ('c', 3)]
zip(*z)
[('a', 'b', 'c'), (1, 2, 3)]
Haskell (GHCI v.7.0.2):
Prelude> let s = "abc"
Prelude> let d = [1, 2, 3]
Prelude> let z = zip s d
Prelude> z
[('a',1),('b',2),('c',3)]
Prelude> unzip z
("abc",[1,2,3])
A D example shows where it's useful:
import std.stdio, std.typecons, std.algorithm, std.range;
Tuple!(int,int) divMod(int n, int m) {
return tuple(n / m, n % m);
}
void main() {
auto r = map!((m){ return divMod(20,m); })(iota(1, 20));
int[] firsts, seconds;
foreach (t; r) {
firsts ~= t[0];
seconds ~= t[1];
}
writeln(firsts);
writeln(seconds);
}
Output:
[20, 10, 6, 5, 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 2, 0, 0, 2, 6, 4, 2, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1]
Similar code in Python shell:
r = (divmod(20, m) for m in xrange(1,20))
firsts, seconds = zip(*r)
firsts
(20, 10, 6, 5, 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1)
seconds
(0, 0, 2, 0, 0, 2, 6, 4, 2, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1)
In Phobos a higher-order function to perform this operation may be named
"unzip" as in Haskell. This unzip is generalizable to zips of more than two
sequences:
unzip(zip([1,2,3], "abc", [0.5,1.0,1.5]))
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 15 2011








d-bugmail puremagic.com