如何以所有顺序获取字符串的所有可能组合

时间:2019-08-01 19:54:31

标签: python

我有以下字符串:abc

我希望得到此数组作为结果:['a','b','c','ab','bc','ca','ba','cb','ac','abc','cab','cba','bac','bca']

我尝试使用itertools.combinations(),但这并没有给我不同的顺序。

2 个答案:

答案 0 :(得分:3)

您可以将递归与生成器一起使用:

def combos(d, c = []):
   if len(c) == len(d):
      yield ''.join(c)
   else:
      if c:
        yield ''.join(c)
      for i in d:
        if i not in c:
           yield from combos(d, c + [i])

print(list(combos('abc')))

输出:

['a', 'ab', 'abc', 'ac', 'acb', 'b', 'ba', 'bac', 'bc', 'bca', 'c', 'ca', 'cab', 'cb', 'cba']

如果您希望保留订单,则可以使用sorted

result = sorted(list(combos('abc')), key=lambda x:[len(x), x])

输出:

['a', 'b', 'c', 'ab', 'ac', 'ba', 'bc', 'ca', 'cb', 'abc', 'acb', 'bac', 'bca', 'cab', 'cba']

答案 1 :(得分:3)

您可以使用itertools.permutations来完成

>>> s = 'abc'
>>> from itertools import permutations
>>> [w for i in range(len(s)) for w in map(''.join, (permutations('abc', i+1)))]
['a', 'b', 'c', 'ab', 'ac', 'ba', 'bc', 'ca', 'cb', 'abc', 'acb', 'bac', 'bca', 'cab', 'cba']