Python 生成所有唯一的k-子序列

Python 生成所有唯一的k-子序列,python,itertools,formal-languages,subsequence,Python,Itertools,Formal Languages,Subsequence,我正在尝试编写一个Python函数(至少最初是这样)来生成长度为k(其中k>0)的所有子序列。因为我只需要唯一的子序列,所以我将子序列和部分子序列都存储在sets中。以下是我从一位同事那里改编的,是我能想到的最好的。它似乎…过于复杂…而且我应该能够滥用itertools,或者递归来做我想做的事情。谁能做得更好 从输入导入集,元组 def子序列(string:str,k:int)->Set[Tuple[str,…]: 如果len(字符串) >不如Python < Cudio> tuple 。 <

我正在尝试编写一个Python函数(至少最初是这样)来生成长度为k(其中k>0)的所有子序列。因为我只需要唯一的子序列,所以我将子序列和部分子序列都存储在
set
s中。以下是我从一位同事那里改编的,是我能想到的最好的。它似乎…过于复杂…而且我应该能够滥用
itertools
,或者递归来做我想做的事情。谁能做得更好

从输入导入集,元组
def子序列(string:str,k:int)->Set[Tuple[str,…]:
如果len(字符串)
(对于上下文,我感兴趣的是归纳法,它是正规语言中一个可以有效学习的子类,语法可以用所有合法的k-子序列来表征


<>我最终也在考虑C++中的代码,其中<代码> STD::MaxuPuple < /C> >不如Python < Cudio> tuple 。

< P>您需要一组<代码> R>代码>组合,从n>代码>项目(W/O替换,<代码> PIP安装MulySyTraveStudio
另请参见编写Python的
itertools.compositions

您可以添加一些示例吗?什么的所有子序列?您可以使用吗?@DanielMesejo:某些iterable的所有子序列(此处键入为字符串)。
“foo”
的2个子序列是
{(“f”,“o”),(“o”,“o”)}
“foobar”的3个子序列
{('o','b','r'),('o','o','a'),('f','b','a','r'),('f','o','o','o'),('f','o','r'),('b','a','r'),('f','o','r'),('f','b','r'),('o','o','o','o','o','b'),('f','o','o','b'),('f','o','o','b'),o','b'),('f','o','o','o','o','b'),'s我想我可以做一些字符串组合
's>)
但我想知道避免中间计算是否有意义。
import itertools as it

import more_itertools as mit
set(it.combinations("foo", 2))
# {('f', 'o'), ('o', 'o')}

set(it.combinations("foobar", 3))
# {('b', 'a', 'r'),
#  ('f', 'a', 'r'),
#  ('f', 'b', 'a'),
#  ('f', 'b', 'r'),
#  ('f', 'o', 'a'),
#  ('f', 'o', 'b'),
#  ('f', 'o', 'o'),
#  ('f', 'o', 'r'),
#  ('o', 'a', 'r'),
#  ('o', 'b', 'a'),
#  ('o', 'b', 'r'),
#  ('o', 'o', 'a'),
#  ('o', 'o', 'b'),
#  ('o', 'o', 'r')}
list(mit.distinct_combinations("foo", 2))
# [('f', 'o'), ('o', 'o')]

list(mit.distinct_combinations("foobar", 3))
# [('f', 'o', 'o'),
#  ('f', 'o', 'b'),
#  ('f', 'o', 'a'),
#  ('f', 'o', 'r'),
#  ('f', 'b', 'a'),
#  ('f', 'b', 'r'),
#  ('f', 'a', 'r'),
#  ('o', 'o', 'b'),
#  ('o', 'o', 'a'),
#  ('o', 'o', 'r'),
#  ('o', 'b', 'a'),
#  ('o', 'b', 'r'),
#  ('o', 'a', 'r'),
#  ('b', 'a', 'r')]