Python生成字符串的所有可能组合

3

您好,我正在使用Python编程,尝试编写一个方法,根据输入的字符串,找到该字符串的所有组合,并将其添加到一个列表中。以下是示例字符串和期望的输出结果:

字符串:x = 'god'

输出结果:

lst = ['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

一个字母只能使用给定字符串中出现的次数,因此如果我们的字符串是'god',则不能添加'gg''goo'等。如果可以使用递归来实现,那就太好了!
5个回答

4
使用 itertools.permutations 和列表解析。
from itertools import permutations
[''.join(j) for i in range(1,len(x) + 1) for j in  permutations(x, i)]

输出

['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

1
哇!这场比赛真是太精彩了,不到几分钟就有三个正确答案。厉害的一行代码。 - undefined

4
使用 permutations
from itertools import permutations

x = 'god'


perms = []

for i in range(1, len(x)+1):
    for c in permutations(x, i):
        perms.append("".join(c))

print(perms) 
# ['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

3

您想使用 itertools。 根据您所写的内容,似乎您想使用 itertools.permutation

>>> import itertools
>>> letters = 'god'
>>> combinations = []
>>> for i in range(len(letters)):
...     combinations.extend(
...         [''.join(x) for x in itertools.permutations(letters, i + 1)])
>>> print(combinations)
['g', 'o', 'd', 'go', 'gd', 'og', 'od', 'dg', 'do', 'god', 'gdo', 'ogd', 'odg', 'dgo', 'dog']

0
import itertools

def _itersubs(x):
    for i in range(1, len(x)+1):
        yield from itertools.permutations(x, i)
        # before 3.4, replace with:
        # for y in itertools.permutations(x, i): yield y

def thefuncyouwant(x):
    return list(_itersubs(x))

我不确定你实际上想要一个长度为2 ** len(x)的列表 - 对于任何不太短的x来说,它将占用很多内存 - 但这是你所要求的,所以这就是它。 显然,每次产生一个项目的迭代器更自然,可能更可取,但只需将其包装在list调用中,将会消耗与你渴望的一样多的内存!-)


0

在这里你要做的是对传入的字符串进行幂集操作。你需要将该字符串转换为字符列表,然后使用幂集的定义,通过简单的列表扩展来创建你所需要的结果。

def list_powerset(lst): # 空集的幂集只有一个元素,就是空集 result = [[]] for x in lst: # 对于集合中的每个额外元素 # 幂集由不包含该元素的子集(直接使用上一次的幂集) # 和包含该元素的子集(使用列表推导式在上一次的幂集中加上 [x]) result.extend([subset + [x] for subset in result]) return result

以上代码来源于http://rosettacode.org/wiki/Power_set#Python


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接