If we know that 1. `tuples` is constructed from `ngrids` *grid*s, and 2. each grid has at least one unique element then, we can extract the lengths using: extractGridLengths = Map[l |-> Total @ Normalize[#, Min] & @ Counts[#[[All, l]]]] @ Range @ #2 &; ngrids = 3; extractGridLengths[tuples, ngrids] > {6, 6, 5} Then, we can use a combination of `ArrayReshape` and `Extract` to get the *grid*s: extractGridPositions = Extract @ Map[m |-> {Splice @ ReplacePart[Table[1, #], {m} -> All], m}] @ Range[#] &; extractGrids = extractGridPositions[#2] @ ArrayReshape[#, Append[Length @ First @ #]@ extractGridLengths[#, #2]] &; extractGrids[tuples, ngrids] == {grid1, grid2, grid3} > True ***Another example***: SeedRandom[1]; numberOfGrids = RandomInteger[{2, 9}] > 8 randomGridLength := RandomInteger[{1, 8}] randomGrids = Table[RandomInteger[100, randomGridLength], numberOfGrids] > {{40, 7, 0, 33, 65}, > {7, 16, 95, 7, 98, 19, 22, 40}, > {1, 25, 22, 84}, > {12, 2, 61, 84, 96, 50, 89, 19}, > {40, 87, 5, 72, 67, 40}, > {10, 86, 76, 43, 33}, > {53, 18, 49}, > {79, 8, 91, 2, 22, 67, 21}} Map[Length] @ randomGrids > {5, 8, 4, 8, 6, 5, 3, 7} paddingLength = 3; randomPadding = RandomReal[{1, 2}, {Times @@ Map[Length]@randomGrids, paddingLength}]; randomTuples = Join[Tuples@randomGrids, randomPadding, 2]; randomTuples // RandomSample[#, 10] & // Column [![enter image description here][1]][1] extractGridLengths[randomTuples, numberOfGrids] > {5, 8, 4, 8, 6, 5, 3, 7} extractGrids[randomTuples, numberOfGrids] == randomGrids > True [1]: https://i.sstatic.net/lT8eR.png