Это должно помочь:
>>> n = 4
>>> from itertools import product
>>> l1 = list((product((0,1), repeat = n)))
>>> l1
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)]
>>> [t for t in l1 if not any(t[i] == 1 and t[i+1] == 1 for i in range(n-1))]
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 1, 0, 0), (0, 1, 0, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0)]
Условие not any(t[i] == 1 and t[i+1] == 1 for i in range(n-1))
в основном проверяет, равны ли последовательные элементы единице. Обратите внимание на итератор индекса range(n-1)
- мы не хотим проверять элемент n th на элемент n + 1, поскольку ни в одном из кортежей нет пятого элемента выше.
Время
Обратите внимание, что моя функция примерно в два раза медленнее, чем , чем функция переполнения кучи .
>>> from time import time as t
>>> def f1():
... t0 = t()
... result = [i for i in l1 if (1, 1) not in zip(i, i[1:])]
... t1 = t()
... print(t1-t0)
...
>>> def f2():
... t0 = t()
... result = [t for t in l1 if not any(t[i] == 1 and t[i+1] == 1 for i in range(n-1))]
... t1 = t()
... print(t1-t0)
...
>>> l1 = list((product((0,1), repeat = n))) * 1000000
>>> len(l1)
16000000
>>> f1()
8.146391868591309
>>> f2()
18.645386934280396