4

辞書攻撃を実行したいので、そのために単語リストが必要です。特定の長さ (または最小長から最大長までの単語の長さ) の指定された文字から単語リストを生成する方法は? itertools.combinations_with_replacementsとを試しitertools.permutationsましたが、役に立ちません。返すべき単語リストがすべて揃っているわけではありません。どんな助けでも大歓迎です。ありがとうございました。

4

4 に答える 4

8

使用itertools.product:

>>> import itertools
>>>
>>> chrs = 'abc'
>>> n = 2
>>>
>>> for xs in itertools.product(chrs, repeat=n):
...     print ''.join(xs)
...
aa
ab
ac
ba
bb
bc
ca
cb
cc

最小長から最大長まで単語を取得するには:

chrs = 'abc'
min_length, max_length = 2, 5    
for n in range(min_length, max_length+1):
    for xs in itertools.product(chrs, repeat=n):
        print ''.join(xs)
于 2014-02-04T17:19:28.680 に答える
2

これは素朴な実装です:

list='abcdefg'
depth=8

def generate(l,d):
  if d<1:
    return
  for c in l:
    if d==1:
      yield c
    else:
      for k in generate(l,d-1):
        yield c+k

for d in range(1,depth):
  for c in generate(list,d):
    print c

コメントするにはまだ十分な評判がないので、上記の itertools サンプルに基づいて完全なリストを作成します。

import itertools
chrs='abc'
n=6
for i in range(1,n):
  for xs in itertools.product(chrs, repeat=i):
    print ''.join(xs)

このようにして、長さ 1 から n までのすべての単語がリストに含まれます。

于 2014-02-04T17:28:52.793 に答える
1
from itertools import product

def allwords(chars, length):
    for letters in product(chars, repeat=length):
        yield ''.join(letters)

def main():
    letters = "abc"
    for wordlen in range(3, 5):
        for word in allwords(letters, wordlen):
            print(word)

if __name__=="__main__":
    main()

戻り値

aaa
aab
aac
aba
abb

...

ccbc
ccca
cccb
cccc    
于 2014-02-04T17:23:29.933 に答える