所有字母与字符列表?

2024-09-30 02:15:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个类似于johntheripper的特殊实用程序,我想使用一个循环来返回所有可以由字符串组成的x个字符的字符串。例如,如果“seed”字符串是abcd,它应该返回:

a
b
c
d
aa
ab
ac

等等。如果字符限制为10,它将生成aaaaaaaaaaabcddcbaaa,依此类推。是否有一个简单的for循环来完成这项工作,或者它比这个更复杂?在


Tags: 字符串实用程序forab字符acaaseed
3条回答

正如评论中指出的,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的答案的一个版本,它返回一个列表:

^{pr2}$

我将从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)

这给了

^{pr2}$

等等。在

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

相关问题 更多 >

    热门问题