Python 从字符串递归创建所有子集

Python 从字符串递归创建所有子集,python,python-2.7,recursion,Python,Python 2.7,Recursion,我试图递归地创建给定字符串的所有子集。 给定字符串='aab',我们为不同的字符生成所有子集。 答案是:[,“b”,“a”,“ab”,“ba”,“a”,“ab”,“ba”,“aa”,“aa”,“aab”,“aab”,“aba”,“aba”,“baa”,“baa”]。 我一直在寻找一些解决方案,例如 但是我试图让函数只接受一个变量——字符串,并使用它,但我不知道怎么做。 我也一直在寻找一个类似问题的解决方案,但由于它处理的是列表而不是字符串,我似乎很难将其转换为接受和生成字符串。 这是我的代码,在

我试图递归地创建给定字符串的所有子集。 给定字符串='aab',我们为不同的字符生成所有子集。 答案是:
[,“b”,“a”,“ab”,“ba”,“a”,“ab”,“ba”,“aa”,“aa”,“aab”,“aab”,“aba”,“aba”,“baa”,“baa”]
。 我一直在寻找一些解决方案,例如 但是我试图让函数只接受一个变量——字符串,并使用它,但我不知道怎么做。 我也一直在寻找一个类似问题的解决方案,但由于它处理的是列表而不是字符串,我似乎很难将其转换为接受和生成字符串。 这是我的代码,在这个示例中,我无法将str连接到列表。这就是我的问题。 我编辑了输入和输出。

def gen_all_strings(word):

    if len(word) == 0:
        return ''

    rest = gen_all_strings(word[1:])

    return  rest + [[ + word[0]] + dummy for dummy in rest]
这是字符串中字符集的名称

from itertools import chain, combinations

s = set('ab') #split string into a set of characters

# combinations gives the elements of the  powerset of a given length r
# from_iterable puts all these into an 'iterable'
# which is converted here to a list

list(chain.from_iterable(combinations(s, r) for r in range(len(s)+1)))
输出:

['''a','b','aa','ab','ba','bb']

['''a','b','c','aa','ab','ac','ba','bb','bc','ca','cb','cc','aab','aac','abb','abc','acb','acc','acc','bab','bac','bba','bbc','bca','cab','cac cba','cbb','cbc','cca','ccb','ccc'.]

老实说,在这种情况下,它感觉真的被迫使用递归,这是一个更简单的版本,具有相同的结果:

nonrecursive_product = lambda s: [''.join(c)for i in range(len(s)+1) for c in product(s,repeat=i)]
按需要导入itertools
定义所有_子集(iterable):
s=列表(iterable)
子集=it.chain.from_iterable(范围(len(s)+1)内r的it.permutation(s,r))
返回列表(映射(“.join,列表(子集)))
打印(所有_子集('aab'))
#[''‘a’、‘a’、‘b’、‘aa’、‘ab’、‘ab’、‘ba’、‘aab’、‘aba’、‘aab’、‘aba’、‘baa’、‘baa’]
打印(所有_子集('abc'))
#[''‘a’、‘b’、‘c’、‘ab’、‘ac’、‘ba’、‘bc’、‘ca’、‘cb’、‘abc’、‘acb’、‘bac’、‘bca’、‘cab’、‘cba’]

您似乎没有自己编写任何代码;请发表你的观点。'aa'和'bb'不是没有递归的'ab'的子集:这能回答你的问题吗@Anwarvic不,它不符合我对递归函数的标准。谢谢,但我正在寻找一个解决方案,通过定义一个只有一个输入的递归函数-字符串。你能不传递I和r吗?意思-仅传递字符串本身?我知道这是强制的…@Stan——为了避免传递I&r,为r:
def recursive\u产品(s,r=None,I=0)添加一个默认值:如果r为None:r=[]
。现在的用法变成了:
print(递归产品('ab'))
nonrecursive_product = lambda s: [''.join(c)for i in range(len(s)+1) for c in product(s,repeat=i)]