0

John the Ripperに似た特殊なユーティリティを作成しており、文字列から形成できるx文字までのすべての文字列を返すループを使用したいと思います。たとえば、「シード」文字列がの場合、abcd次を返す必要があります。

a
b
c
d
aa
ab
ac

等々。文字数制限が10の場合、、、などが生成さaaaaaaaaaaabcddcbaaaます。これを行うための単純なforループはありますか、それともそれよりも複雑ですか?

4

4 に答える 4

3

この回答から自己盗用し、最大長を追加します。

from itertools import product

def multiletters(seq, max_length):
    for n in range(1, max_length+1):
        for s in product(seq, repeat=n):
            yield ''.join(s)

これは

>>> list(multiletters("abc", 2))
['a', 'b', 'c', 'aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc']
>>> list(multiletters("abcd", 4))[:8]
['a', 'b', 'c', 'd', 'aa', 'ab', 'ac', 'ad']

等々。

于 2013-02-04T19:42:15.160 に答える
1

コメントの使用法で指摘されているように、itertools.premutationsまたは@DSMの回答を見てください。これは、ダブルスを見逃しているためです。

In [194]: from itertools import chain, permutations

In [195]: s = 'abcd'

In [196]: map(''.join,chain.from_iterable(permutations(s,x) 
                               for x in range(1,len(s)+1)))
Out[196]: 
['a',
 'b',
 'c',
 'd',
 'ab',
 'ac',
 'ad',
 'ba',
 'bc',
 'bd',
  ...
 'dbca',
 'dcab',
 'dcba']

とにかく、リストを返す@DSMの回答のバージョンは次のとおりです。

from itertools import product

def ms(seq, max_length):
    return [''.join(s) for n in range(1, max_length+1)
                       for s in product(seq,repeat=n)]
于 2013-02-04T19:38:26.613 に答える
1
def all_strings(alphabet, length_limit=None):
  n_letters = len(alphabet)
  length = 0
  n_strings = 1
  buf = []
  while True:
    for i in xrange(0, n_strings):
      k = i
      for j in xrange(length - 1, -1, -1):
        buf[j] = alphabet[k % n_letters]
        k /= n_letters
      yield ''.join(buf)
    length += 1
    if length == length_limit:
      break
    n_strings *= n_letters
    buf.append(alphabet[0])

for s in all_strings('abcd', length_limit=4):
  print s
于 2013-02-04T19:46:35.987 に答える
1

itertools.permuataionsを使用します。

for i in range(2,4):
    tuples = itertools.permutations('abca' , i)
    print( list(tuples))

サンプルコードシーケンスは以下を生成します:

[('a'、'b')、('a'、'c')、('a'、'a')、('b'、'a')、('b'、'c') 、('b'、'a')、('c'、'a')、('c'、'b')、('c'、'a')、('a'、'a') 、('a'、'b')、('a'、'c')]

[('a'、'b'、'c')、('a'、'b'、'a')、('a'、'c'、'b')、('a'、'c '、' a')、(' a'、' a'、' b')、(' a'、' a'、' c')、(' b'、' a'、' c')、( 'b'、'a'、'a')、('b'、'c'、'a')、('b'、'c'、'a')、('b'、'a'、 'a')、('b'、'a'、'c')、('c'、'a'、'b')、('c'、'a'、'a')、('c '、' b'、' a')、(' c'、' b'、' a')、(' c'、' a'、' a')、(' c'、' a'、' b ')、(' a'、' a'、' b')、(' a'、' a'、' c')、(' a'、' b'、' a ')、('a'、'b'、'c')、('a'、'c'、'a')、('a'、'c'、'b')]

于 2013-02-04T21:19:19.593 に答える