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