Python或Cpp中1的排列而没有前导或尾随0

时间:2019-03-05 15:25:55

标签: python math iteration permutation combinatorics

我需要一种有效的方法来生成列表列表,以探索Nx1和Kx0的所有排列。但是,我需要删除所有前导和尾随的0,然后删除重复项。 K-N为100,N为2到20之间的任意位置。

我可以分步骤进行: 1)创建排列 2)删除每个列表元素的尾随0 3)删除每个列表元素的前导0 4)删除重复项

但是,执行前三个步骤需要花费非常长的时间,因此我认为我需要找到一种不同的方法。这是我使用的代码:

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]]

1 个答案:

答案 0 :(得分:1)

在Engineero的评论中得到解答。

删除开头和结尾的0就像说它需要以1开头和结尾一样。因此,使用N-2进行排列,然后将1绑在末端。

谢谢!

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

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

.basic-container .mat-step-header .mat-step-icon-selected {
  background-color: #6cb73a;
  color: #fff;
}

.mat-step-header .mat-step-icon {
    background-color: rgba(167, 35, 35, 0.54);
    color: #fff;
}