簡體   English   中英

Python或Cpp中1的排列而沒有前導或尾隨0

[英]Permutations of 1s without leading or trailing 0s in Python or Cpp

我需要一種有效的方法來生成列表列表,以探索Nx1和Kx0的所有排列。 但是,我需要刪除所有前導和尾隨的0,然后刪除重復項。 KN為100,N為2至20之間的任意值。

我可以按以下步驟進行操作:1)創建排列2)刪除每個列表元素的尾隨0s 3)刪除每個列表元素的前導0s 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]]

在Engineero的評論中回答。

刪除前導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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM