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):[('a', 1), ('b', 2), ('c', 3)]s = "abc" d = [1, 2, 3] z = zip(s, d) 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:zip(*z)(20, 10, 6, 5, 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1)r = (divmod(20, m) for m in xrange(1,20)) firsts, seconds = zip(*r) firsts(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: -------seconds
May 15 2011