Removing lists with zero at any position
DeleteCases[Tuples[Range[-2, 2], 2], {___, 0, ___}] (* or *)
DeleteCases[data, {0, 0}|{1,0}|{0,1}]
{{-2, -2}, {-2, -1}, {-2, 1}, {-2, 2}, {-1, -2}, {-1, -1}, {-1, 1}, {-1, 2}, {1, -2}, {1, -1}, {1, 1}, {1, 2}, {2, -2}, {2, -1}, {2, 1}, {2, 2}}
Alternatively, if you can, remove zeros from the input lists before using Tuples
:
Tuples[Join[-Reverse@#, #]&@Range[2],2]
same result
Even if data = Tuples[Range[-2, 2], 2]
is already created, processing data
to create a zero-free input list and using Tuples
on it is (to my surprise) faster than using Pick
to remove entries with zeros from pairs of data:
data = Tuples[Range[-100, 100], 2];
ra = Tuples[Join[-Reverse @ #, #]& @ Range[100],2]; // RepeatedTiming // First
0.0000524
rb = With[{r = DeleteCases[DeleteDuplicates @ Flatten[data], 0]},
Tuples[r, 2]];// RepeatedTiming // First
0.000178
rc = Pick[data, Unitize[data].{1, 1}, 2];//RepeatedTiming//First (*from @Henrik's answer*)
0.0013
rd = DeleteCases[data, {0, 0}|{1,0}|{0,1}];// RepeatedTiming // First
0.017
re = DeleteCases[data, {___, 0, ___}];// RepeatedTiming // First
0.026
rf = Select[data, FreeQ[0] ];// RepeatedTiming // First (*from David's answer *)
0.060
ra == rb == rc == rd == re == rf
True
Here a more cumbersome (not a code golfer) but faster approach:
data = Tuples[Range[-100, 100], 2];
a = DeleteCases[data, {___, 0, ___}]; // RepeatedTiming // First
b = Pick[data, Unitize[data].{1, 1}, 2]; // RepeatedTiming // First
a == b
0.028
0.00098
True
This skips pattern matching in favor of faster vectorized functions.
Or...
Select[Tuples[Range[-2, 2], 2], ! MemberQ[#, 0] &]
or as @ThatGravityGuy points out...
Select[Tuples[Range[-2, 2], 2], FreeQ[#, 0] &]