Вы можете использовать itertools.product
над двумя функциями фильтра с repeat
размерами кортежей на вашем входе, затем zip
фильтр функционирует с отдельными элементами в каждом кортеже и выводить кортеж только если все фильтрыудовлетворены:
[[t for t in vals if all(f(i) for (f, i) in zip(filters, t))] for filters in product(((0).__le__, (0).__ge__), repeat=len(vals[0]))]
, так что с учетом вашего образца ввода:
vals = [(0, 0, 0), (0, 0, 1), (0, 0, -1), (0, 1, 0), (0, 1, 1), (0, 1, -1), (0, -1, 0), (0, -1, 1), (0, -1, -1), (1, 0, 0), (1, 0, 1), (1, 0, -1), (1, 1, 0), (1, 1, 1), (1, 1, -1), (1, -1, 0), (1, -1, 1), (1, -1, -1), (-1, 0, 0), (-1, 0, 1), (-1, 0, -1), (-1, 1, 0), (-1, 1, 1), (-1, 1, -1), (-1, -1, 0), (-1, -1, 1), (-1, -1, -1)]
Это возвращает:
[[(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(1, 0, 0),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1)],
[(0, 0, 0),
(0, 0, -1),
(0, 1, 0),
(0, 1, -1),
(1, 0, 0),
(1, 0, -1),
(1, 1, 0),
(1, 1, -1)],
[(0, 0, 0),
(0, 0, 1),
(0, -1, 0),
(0, -1, 1),
(1, 0, 0),
(1, 0, 1),
(1, -1, 0),
(1, -1, 1)],
[(0, 0, 0),
(0, 0, -1),
(0, -1, 0),
(0, -1, -1),
(1, 0, 0),
(1, 0, -1),
(1, -1, 0),
(1, -1, -1)],
[(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(-1, 0, 0),
(-1, 0, 1),
(-1, 1, 0),
(-1, 1, 1)],
[(0, 0, 0),
(0, 0, -1),
(0, 1, 0),
(0, 1, -1),
(-1, 0, 0),
(-1, 0, -1),
(-1, 1, 0),
(-1, 1, -1)],
[(0, 0, 0),
(0, 0, 1),
(0, -1, 0),
(0, -1, 1),
(-1, 0, 0),
(-1, 0, 1),
(-1, -1, 0),
(-1, -1, 1)],
[(0, 0, 0),
(0, 0, -1),
(0, -1, 0),
(0, -1, -1),
(-1, 0, 0),
(-1, 0, -1),
(-1, -1, 0),
(-1, -1, -1)]]