包含字符列表的所有字符串?

时间:2013-02-04 19:25:59

标签: python string loops

我正在创建一个类似于John the Ripper的专用实用程序,我想使用一个循环来返回所有可以从字符串形成的x个字符的字符串。例如,如果“种子”字符串为abcd,则应返回:

a
b
c
d
aa
ab
ac

等等。如果字符数限制为10,则会生成aaaaaaaaaaabcddcbaaa,依此类推。是否有一个简单的for循环来执行此操作,还是比它更复杂?

4 个答案:

答案 0 :(得分:3)

我将从this answer自我抄袭并添加最大长度:

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']

等等。

答案 1 :(得分: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)]

答案 2 :(得分: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

答案 3 :(得分: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')]