如何删除 itertools.product 函数的镜像反射值?

Tom*_*ski 5 python python-itertools python-3.x

我使用以下itertools.product函数创建笛卡尔积:

from itertools import product

a = list(map(list, itertools.product(list(range(2)), repeat=3)))
Run Code Online (Sandbox Code Playgroud)

输出:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

然后我通过以下方式摆脱镜子反射:

b = [] 
for k, v in enumerate(a):
    if v[::-1] not in a[:k]:
       b.append(v[::-1])
Run Code Online (Sandbox Code Playgroud)

输出:

[[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 1], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

但是我可以在不保存itertools.product列表中的所有结果的情况下逐步获得相同的效果吗?例如,使用 for 循环的常用方法:

for i in list(map(list, itertools.product(list(range(2)), repeat=3))):
    # blah blah blah
Run Code Online (Sandbox Code Playgroud)

因为最终我会使用大的笛卡尔积,至少repeat = 18. 这就是为什么我必须放弃列表中的方法。除非有其他方法可以做到?我将不胜感激任何提示。

Pio*_*ost 4

import itertools

l = (list(i) for i in itertools.product(tuple(range(2)), repeat=3) if tuple(reversed(i)) >= tuple(i))
print list(l)
Run Code Online (Sandbox Code Playgroud)

输出:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)