有没有更好的方法来创建由长度限定的字符串的排列?
我需要创建列表中所有字符串的排列。 我的列表可以增长到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
这只是itertools库中的代码,插入了长度检查和outfile.write。 我曾经输出到一个列表,因为我想按行排序,但为了优化,我只是把它们写到一个文件中,所以它们不会被存储。
我看到两个效率低下的地方,但我无法改进它:
在我看来,置换函数“困扰”产生所有的线,但不会返回不符合边界的线。 我一直在试图想出一种方法,它甚至不会“打扰”产生不合适的长度。
条件检查包含元组的实际生成,所以如果元组有效,则需要生成两次元组。 另外,长度检查需要执行len
, str
, join
和tuple
函数以及池中项目的完整迭代。 这不是最快的方法,但我还没有想出如何在加入和转换之前确定完成的行的长度。
有任何想法吗?
链接地址: http://www.djcxy.com/p/24323.html上一篇: Is there a better way to create permutations of string w bounded by length?