Python 3.x 如何限制排列的数量

Python 3.x 如何限制排列的数量,python-3.x,permutation,Python 3.x,Permutation,我有大约20个短字符串要排列。我只想要len==8的排列 我希望避免计算所有可能的排列,如下所示: import itertools p = itertools.permutations([s1, s2, s3, s4, s5, s6,...]) for i in p: s = ''.join(j for j in i) if len(s)==8: print(s) 但那太慢了,对吧?如何减少计算的次数?不要花费处理和RAM。第一件显而易见的事情是过滤掉任何长度

我有大约20个短字符串要排列。我只想要len==8的排列

我希望避免计算所有可能的排列,如下所示:

import itertools
p = itertools.permutations([s1, s2, s3, s4, s5, s6,...])
for i in p:
    s = ''.join(j for j in i)
    if len(s)==8:
        print(s)

但那太慢了,对吧?如何减少计算的次数?不要花费处理和RAM。

第一件显而易见的事情是过滤掉任何长度大于8的字符串:

newList = [i for i in [s1, s2, s3, s4, s5, s6, ...] if len(i) <= 8]
但是,如果您的任何字符串长度超过一个字符,这将无法得到您想要的内容,因为它只返回正好8个项目的排列。解决此问题的一种方法是迭代不同的长度:

pList = [itertools.permutations(newList, length) for length in range(1, 9)]
然而,在这里,你需要过滤大量的排列:P20,8+P20,7+。。。P20,1=大致上,这是不实际的

不同的方向 我们不使用排列,而是使用组合,其中只有很少的组合。回想一下,在组合中,组合项的顺序无关紧要,而在排列中则无关紧要。因此,我们可以使用较小的组合集来过滤我们想要的长度8:

cList = (combo for length in range(1, 9) 
    for combo in itertools.combinations(newList, length) 
    if len(''.join(combo)) == 8)
使用instead of[]将使其成为生成器而不是列表,以延迟评估,直到我们真正需要它。现在我们接近了

我们可以通过对cList中的项进行排列来获得最终结果:


第一件显而易见的事情是过滤掉任何长度大于8的字符串:

newList = [i for i in [s1, s2, s3, s4, s5, s6, ...] if len(i) <= 8]
但是,如果您的任何字符串长度超过一个字符,这将无法得到您想要的内容,因为它只返回正好8个项目的排列。解决此问题的一种方法是迭代不同的长度:

pList = [itertools.permutations(newList, length) for length in range(1, 9)]
然而,在这里,你需要过滤大量的排列:P20,8+P20,7+。。。P20,1=大致上,这是不实际的

不同的方向 我们不使用排列,而是使用组合,其中只有很少的组合。回想一下,在组合中,组合项的顺序无关紧要,而在排列中则无关紧要。因此,我们可以使用较小的组合集来过滤我们想要的长度8:

cList = (combo for length in range(1, 9) 
    for combo in itertools.combinations(newList, length) 
    if len(''.join(combo)) == 8)
使用instead of[]将使其成为生成器而不是列表,以延迟评估,直到我们真正需要它。现在我们接近了

我们可以通过对cList中的项进行排列来获得最终结果:


但这给了我一个像s1s2s3s4s5的字符串,这个字符串不一定有len 8Ah,我明白了。好吧,你可以用同样的循环,但是从排列长度8开始,而不是任何长度的排列。这会减少很多计算量。不,不会。对不起,你说的“必须坚持现有版本”是什么意思?@larissa:你有大约20个短字符串。你把它们都排列了。对于每个排列,将序列中的所有字符串连接起来。假设每个字符串的长度都不为零,那么您如何期望lens==8?它将永远至少是20。。因此,您需要使用length参数将每个序列中的字符串数量限制为偶尔会产生长度为8的串联字符串的数量。过度使用RAM在这里不应该是一个问题,因为置换是一个Python生成器,这意味着它一次创建一个置换,而不是一次创建所有置换。我正在制作一个单词列表创建者来提高我的字符串技能,我想对字符串组合进行置换,从而得到一个8字节的字符串,但听起来好像要花很多时间来计算。谢谢你的RAM信息!但这给了我一个像s1s2s3s4s5的字符串,这个字符串不一定有len 8Ah,我明白了。好吧,你可以用同样的循环,但是从排列长度8开始,而不是任何长度的排列。这会减少很多计算量。不,不会。对不起,你说的“必须坚持现有版本”是什么意思?@larissa:你有大约20个短字符串。你把它们都排列了。对于每个排列,将序列中的所有字符串连接起来。假设每个字符串的长度都不为零,那么您如何期望lens==8?它将永远至少是20。。因此,您需要使用length参数将每个序列中的字符串数量限制为偶尔会产生长度为8的串联字符串的数量。过度使用RAM在这里不应该是一个问题,因为置换是一个Python生成器,这意味着它一次创建一个置换,而不是一次创建所有置换。我正在制作一个单词列表创建者来提高我的字符串技能,我想对字符串组合进行置换,从而得到一个8字节的字符串,但听起来好像要花很多时间来计算。谢谢你的RAM信息!