Python或Cpp中不带前导或尾随0的1的排列

Python或Cpp中不带前导或尾随0的1的排列,python,math,iteration,permutation,combinatorics,Python,Math,Iteration,Permutation,Combinatorics,我需要一种高效的方法来生成一个列表列表,探索nx1和Kx0s的所有排列。但是,我需要删除所有前导0和尾随0,然后删除重复的0。K-N为100秒,N为2到20之间的任意值 我可以分步骤执行此操作: 1创建排列 2删除每个列表元素的尾随0 3删除每个列表元素的前导0 4删除重复项 然而,前3个步骤需要很长时间,因此我认为我需要找到一种不同的方法。以下是我使用的代码: import itertools def donewk(k): newk = [] for i in k: if i

我需要一种高效的方法来生成一个列表列表,探索nx1和Kx0s的所有排列。但是,我需要删除所有前导0和尾随0,然后删除重复的0。K-N为100秒,N为2到20之间的任意值

我可以分步骤执行此操作: 1创建排列 2删除每个列表元素的尾随0 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]]

由工程师在评论中回答

删除前导0和尾随0与表示它需要以1开始和结束是一样的。因此,用N-2进行排列,然后在末端绑上1

谢谢

编辑: 我以为Engineero回答了这个问题,但事实上他没有回答,因为这并不能解决第一个和最后一个1之间的间距小于K的问题。他确实给出了一个令人满意的答案

我创建了一个迭代应用程序。我的最后一个应用程序是cpp,但我用python做了一个快速原型作为概念证明。注意:在cpp应用程序中,我将调用一个单独的函数,该函数使用排列,而不是附加到我的列表中。请随意评论,以提高效率

import copy
aList = []

def initA(sz=10):
        return [1]+[0]*(sz-2)+[1];

def iterA(buff,level,ix):
    if (level >0):
        for i in range (level,ix):
            a=copy.deepcopy(buff)
            a[i] = 1;
            if level ==1:
                aList.append(a)
            iterA(a,level-1,i);

N=6;
K=10;
for i in range (N-2,K):
    a=initA(i+1)
    a = iterA(a,N-2,i)
print (aList);

只是一个想法,但你知道两边都需要一个,所以这是两个。你就不能把你的K个零和N-2个一全部排列,然后用1把它们包起来吗?太棒了!谢谢你,你是个天才。