Python 有没有更好的方法来创建以长度为边界的字符串w的排列?
我需要创建列表中所有字符串的排列。我的列表可以增加到300多个条目,因此我开始从Python 有没有更好的方法来创建以长度为边界的字符串w的排列?,python,list,optimization,permutation,Python,List,Optimization,Permutation,我需要创建列表中所有字符串的排列。我的列表可以增加到300多个条目,因此我开始从itertools中寻找优化permutations函数的方法 不幸的是,列表的长度是必须的。缩小范围是可能的,但就我而言,列表越长越好 我知道有多少个置换是可能的,而且这个数字会随着置换长度呈指数增长——这对我的目的也是至关重要的 到目前为止,我已经能够找到一种只输出在一定长度范围内的排列的方法: def bounded_permutations(iterable, min_length, max_length,
itertools
中寻找优化permutations
函数的方法
不幸的是,列表的长度是必须的。缩小范围是可能的,但就我而言,列表越长越好
我知道有多少个置换是可能的,而且这个数字会随着置换长度呈指数增长——这对我的目的也是至关重要的
到目前为止,我已经能够找到一种只输出在一定长度范围内的排列的方法:
def bounded_permutations(iterable, min_length, max_length, outfilename, r=None):
outfile = open(outfilename,'w+')
outfile.truncate()
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
if r > n: return
indices = range(n)
cycles = range(n, n-r, -1)
if min_length <= len(str(''.join((tuple(pool[i] for i in indices[:r]))))) <= max_length:
outfile.writelines((str(''.join(tuple(pool[i] for i in indices[:r])))) + '\n')
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
if min_length <= len(str(''.join((tuple(pool[i] for i in indices[:r]))))) <= max_length:
outfile.writelines((str(''.join(tuple(pool[i] for i in indices[:r])))) + '\n')
break
else: return
def有界排列(iterable,min_length,max_length,outfilename,r=None):
outfile=open(outfilename,“w+”)
outfile.truncate()
pool=元组(iterable)
n=长(池)
如果r不是其他r,则r=n
如果r>n:返回
指数=范围(n)
循环=范围(n,n-r,-1)
如果是min_length,你想用它实现什么?我们能优先考虑“更有可能”的组合吗?因为你可以很容易地在接下来的十亿年中生成组合,而不需要找到你想要的。我正在构建一个变体。我只是从排列开始,因为我认为如果我自己去尝试创建变体,我自己的创造力(或缺乏创造力)可能会限制可能密码的生成。该脚本已经对可能的排列长度设置了上限,因此它甚至没有尝试创建所有可能的排列-它只创建长度不超过5项的可能性。尽管如此,300P5的长度为2.3e12项,因此可能会对可能性的数量实施更严格的限制。你想用它实现什么?我们能优先考虑“更有可能”的组合吗?因为你可以很容易地在接下来的十亿年中生成组合,而不需要找到你想要的。我正在构建一个变体。我只是从排列开始,因为我认为如果我自己去尝试创建变体,我自己的创造力(或缺乏创造力)可能会限制可能密码的生成。该脚本已经对可能的排列长度设置了上限,因此它甚至没有尝试创建所有可能的排列-它只创建长度不超过5项的可能性。尽管如此,300P5的长度为2.3e12个项目,因此可能会对可能的数量实施更严格的限制。