Мне нужен эффективный способ создания списка списков, исследующих все перестановки Nx1s и Kx0s. Однако мне нужно удалить все начальные и конечные 0, а затем удалить дубликаты. K-N будет в сотнях, N будет где-то между 2 и 20.
Я могу сделать это по шагам:
1) Создание перестановок
2) Удалить завершающие нули для каждого элемента списка
3) Удалить ведущие 0 для каждого элемента списка
4) Удалить дубликаты
Однако первые 3 шага занимают очень много времени, поэтому я думаю, что мне нужно найти другой подход. Вот код, который я использовал:
import itertools
def donewk(k):
newk = []
for i in k:
if i not in newk:
newk.append(i)
return newk
n=2;
k=10;
a=(list(itertools.permutations( [1]*n+[0]*(k-2))))
for i,elem in enumerate(a):
elem = list(elem)
while not elem[-1]:
elem.pop()
while not elem[0]:
elem.pop(0)
a[i]=elem;
a=donewk(a)
print(a)
выход
[[1, 1], [1, 0, 1], [1, 0, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]]