如何从特定的字母/数字开始itertools组合?

时间:2016-04-09 17:40:17

标签: python combinations itertools

我有这样的代码:

start = 1
end = 2
for length in range(start, end+1):
    for c in itertools.combinations_with_replacement(string.ascii_letters + string.digits, length):

这将打印从A到Z的每个大写/小写字母,并且在所有字母完成后,它将开始打印从0到9的所有数字。所以它看起来像这样:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

完成第一个循环后,它继续第二个循环并执行相同的操作。 像这样:

第一个周期开始:a

第二个周期开始:aa

等等。

我想要它做什么:

我想从特定字母或数字开始组合。

像这样:

组合1:

第一个周期开始:b

第二个周期开始:ba

如果不可能,那么就像这样:

组合2:

第一个周期开始:b

第二个周期开始:bb

1 个答案:

答案 0 :(得分:1)

我认为您要求在某个指数之后进行所有可能的修改,在这种情况下您可以这样做:

import string
import itertools

chars = string.ascii_letters + string.digits

def alpha_perms(index):

    return list(itertools.permutations(chars[index:]))

print(alpha_perms(0)) #0th index to go along with the below statement

虽然......这很可能(绝对)冻结你的机器。 chars中有62个字符62!(62阶乘),大约等于 3.1469973e + 85 ~π*假设你传入了第0个索引,那么10 ^ 85th 幂可能的组合。即使合理的指数也需要很长时间。

或者,因为使用return list(...)会导致高组合可能性的问题。您可以yield

import string
import itertools

chars = string.ascii_letters + string.digits

def alpha_perms(index):

    for perm in itertools.permutations(chars[index:]):
         yield perm