Python 生成所有唯一的k-子序列
我正在尝试编写一个Python函数(至少最初是这样)来生成长度为k(其中k>0)的所有子序列。因为我只需要唯一的子序列,所以我将子序列和部分子序列都存储在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 。 <
set
s中。以下是我从一位同事那里改编的,是我能想到的最好的。它似乎…过于复杂…而且我应该能够滥用itertools
,或者递归来做我想做的事情。谁能做得更好
从输入导入集,元组
def子序列(string:str,k:int)->Set[Tuple[str,…]:
如果len(字符串)
(对于上下文,我感兴趣的是归纳法,它是正规语言中一个可以有效学习的子类,语法可以用所有合法的k-子序列来表征
<>我最终也在考虑C++中的代码,其中<代码> STD::MaxuPuple < /C> >不如Python < Cudio> tuple 。 < P>您需要一组<代码> R>代码>组合,从
另请参见编写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')]