生成所有唯一的k子序列

结构歧义

我试图编写一个Python函数(至少在最初是这样),以生成某个长度为k(其中k> 0)的所有子序列。由于我只需要唯一的子序列,因此我会将子序列和部分子序列都存储在sets中。以下是我从同事那里改编而成的,是我能想到的最好的。似乎...太复杂了...就像我应该能够滥用itertools或递归地做我想做的事情。谁能做得更好?

from typing import Set, Tuple


def subsequences(string: str, k: int) -> Set[Tuple[str, ...]]:
    if len(string) < k:
        return set()
    start = tuple(string[:k])
    result = {start}
    prev_state = [start]
    curr_state = set()
    for s in string[k:]:
        for p in prev_state:
            for i in range(k):
                new = p[:i] + p[i + 1 :] + (s,)
                curr_state.add(new)
        result.update(curr_state)
        prev_state = list(curr_state)
        curr_state.clear()
    return result

(就上下文而言,我对k严格的分段语言的归纳感兴趣,这是常规语言的有效学习的子类,并且语法可以由所有合法的k子序列表征。

最终,我还考虑在C ++中做到这一点,而C ++的std::make_tuple功能却不如Python强大tuple。)

pylang

您需要一组项目r组合n(不包括替换项,<= (n choose r)

给定

import itertools as it

import more_itertools as mit

选项1 -itertools.combinations

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')}

选项2 -more_itertools.distinct_combinations

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')]

这两个选项产生相同(无序)的输出。然而:

  • 选项1接受所有组合的集合(包括重复项)
  • 选项2不计算重复的中间体

more_itertools通过安装> pip install more_itertools

也看到了粗糙实现itertools.combinations书面Python的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

生成具有所有唯一k位子序列的所有n位序列。

生成最长的位序列,其中所有5位连续子序列都是唯一的

计算所有乘积小于K的子序列

生成唯一 ID 序列

BIND文件序列-是否对所有区域都是唯一的?

获取一个序列的所有子序列

为所有字谜生成相同的唯一哈希码

逐步生成唯一的序列号

更新休眠序列以生成唯一 ID

生成所有k的数字序列,该数字序列的第k位从左到右从右到右加到10

是否有O(n ^ 2)算法可生成数组的所有子序列?

从字符串生成所有空缺的k-mer序列

生成每个节点有2个输入的所有唯一有向图

如何生成具有预定义“唯一性”的整数序列?

没有RDS的AWS中唯一的序列号生成器?

更改 PHP 序列化数据中所有唯一键的值

为每组生成具有给定列的所有唯一值的行

从具有重复元素的向量生成所有唯一组合

如何獲取所有沒有子元素的唯一 XML 節點?

找到 1 到 k 之间 n 个数字的所有唯一组合

k均值输入应包含唯一值还是所有值(也要重复)?

从数组生成所有连续序列

如何生成时间序列的所有排列?

生成所有可能的“唯一” RPN(反向波兰表示法)表达式

生成两个Excel列的所有可能的唯一组合

组合 3 个表以生成所有列的唯一组合

生成项目的所有唯一组合

Python:生成所有长度为N的唯一排序的列表

生成数组的所有唯一组合的最佳方法?