如何解决Python 在一组序列中提取长度为 X 的常见模式
假设我有以下内容:data = ['ABCD','ABABC','BCAABCD']
我正在尝试创建一个函数,它使用 Counter 取三个 argv,一个用于数据,第二个用于必须考虑此模式的序列数量的最小比例,第三个用于这是最大模式长度。
一个工作功能应该给我以下内容:
>>> check(data,0.50,2)
Counter({'A': 3,'AB': 3,'B': 3,'BC': 3,'C': 3,'CD': 2,'D': 2})
>>> check(data,0.34,4)
Counter({'A': 3,'ABC': 3,'ABCD': 2,'BCD': 2,'D': 2})
我真的迷失在这件事上,我只知道如何获得两个或多个字母的组合:
Counter(combinations(data[0],2)) & Counter(combinations(data[1],2)) & Counter(combinations(data[2],2))
而且我还知道如何使用:
Counter(data[0]) + Counter(data[1]) + Counter(data[2])
(奇怪的是,我无法像我希望的那样使用列表理解来计算这个总和,因为错误说我不能在 'str' 和 'int' 之间做 '+'
如果你们不能给我完整的代码,没问题,我只需要一些关于如何开始整个事情并获得逻辑的指导。
祝阅读我整篇文章的人度过愉快的一天:)
解决方法
您可以使用递归生成器函数获取 int main() {
list l;
list* ptl = &l;
int t;
createl(ptl); // add initialization
cout << "Put 5 elements:\n";
for (int i = 0; i < 5; ++i) {
cin >> t;
insert(t,sizel(ptl),ptl);
}
中合并子串(长度为 <=
的最大值)的所有组合,并使用 data
找到子串交集:
collections.defaultdict
输出:
from collections import defaultdict
data = ['ABCD','ABABC','BCAABCD']
def combos(d,l,c = []):
if c:
yield ''.join(c)
if d and len(c) < l:
yield from combos(d[1:],c+[d[0]])
if not c:
yield from combos(d[1:],c)
def check(d,p,l):
_d = defaultdict(set)
for i in d:
for j in combos(i,l):
_d[j].add(i)
return {a:len(b) for a,b in _d.items() if len(b)/len(d) >= p}
print(check(data,0.50,2))
print(check(data,0.34,4))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。