【发布时间】:2019-03-05 15:25:54
【问题描述】:
我需要一种有效的方法来生成列表列表,探索 Nx1s 和 Kx0s 的所有排列。但是我需要删除所有前导和尾随 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]]
【问题讨论】:
-
只是一个想法,但你知道你需要两边都有,所以这是两个。难道你不能对你的 K 个零和 N-2 个进行所有排列,然后用 1 包装它们吗?
-
太棒了!你真是个天才,谢谢。
标签: python math iteration permutation combinatorics