Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更好的方法来创建以长度为边界的字符串w的排列?_Python_List_Optimization_Permutation - Fatal编程技术网

Python 有没有更好的方法来创建以长度为边界的字符串w的排列?

Python 有没有更好的方法来创建以长度为边界的字符串w的排列?,python,list,optimization,permutation,Python,List,Optimization,Permutation,我需要创建列表中所有字符串的排列。我的列表可以增加到300多个条目,因此我开始从itertools中寻找优化permutations函数的方法 不幸的是,列表的长度是必须的。缩小范围是可能的,但就我而言,列表越长越好 我知道有多少个置换是可能的,而且这个数字会随着置换长度呈指数增长——这对我的目的也是至关重要的 到目前为止,我已经能够找到一种只输出在一定长度范围内的排列的方法: def bounded_permutations(iterable, min_length, max_length,

我需要创建列表中所有字符串的排列。我的列表可以增加到300多个条目,因此我开始从
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个项目,因此可能会对可能的数量实施更严格的限制。