-1

我需要编写产生所有可能的 8 个符号字符串的生成器。从这样的符号数组中:

leters = ['1','2','3','4','5','6','7','8','9','0','q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m']

骨架看起来像这样:

def generator():
    """
    here algorithm
    """
    yield string

假设返回这样的列表['00000001','00000002','00000003', ......'mmmmmmmm']

4

4 回答 4

7
itertools.product(leters, repeat=8)

编辑:让它给你字符串而不是元组:

def generator(leters):
    a = itertools.product(leters,repeat=3)
    while a:
        yield "".join(a.next())
于 2011-06-08T18:27:14.577 回答
7

itertools.combinations()itertools.combinations_with_replacement()返回一个生成器

>>> letters = ['a', 'b', 'c']
>>> from itertools import combinations

print()在示例中使用来说明输出。将其替换为yield, 以获得生成器。

>>> for c in combinations(letters, 2): 
        print(c)
... 
('a', 'b')
('a', 'c')
('b', 'c')

>>> for c in combinations(letters, 2): 
        print(''.join(c))
... 
ab
ac
bc
>>> 

>>> for c in itertools.combinations_with_replacement(letters, 2): 
        print(''.join(c))
... 
aa
ab
ac
bb
bc
cc

如果你对所有包含英文字母和数字的 8 个字母的密码进行暴力破解,你希望迭代超过 2.8 万亿个字符串

编辑 如果您以某种方式知道没有重复的元素,请使用permutations

>>> for c in itertools.permutations(letters, 2): 
        print(''.join(c))
... 
ab
ac
ba
bc
ca
cb

这给了你abba

itertools.product()对于Cosmologicon 解决方案中最一般的蛮力序列使用

于 2011-06-08T18:29:37.180 回答
2
import itertools
itertools.combinations_with_replacement(leters, 8)

顺便说一句,字母有两个 T。

于 2011-06-08T18:28:04.867 回答
0

我也想知道如何做到这一点,这就是我想出的,我尝试了几种方法,但是当我这样写它时,它比其他方法快得多……如果我没有看到,请 lmk

import string

from itertools import permutations

[print(*p,sep='')for p in permutations(list(string.ascii_letters+string.punctuation+string.digits),8)]
于 2019-01-04T05:44:22.663 回答