python - 使用模式阈值识别单词列表中的模式

标签 python arrays loops masking

在 Python 中开发一个模式识别函数,该函数假设返回一个带有计数器的模式数组

让我们想象一个字符串列表:

m = ['ABA','ABB', 'ABC','BCA','BCB','BCC','ABBC', 'ABBA', 'ABBC']

在高层,我想得到的返回是:

Pattern | Count
----------------
   AB   |   6
  ABB   |   4
   BC   |   3
----------------

问题:据我所知,模式以 2 个字符开头并且是每个字符串值的前导字符(即 XXZZZ、XXXZZZ(其中 XX 是我正在寻找的模式))。我希望能够将模式的最小长度参数化为函数的输入以优化运行时间。

附言。列表中的每个项目已经是一个单词。

我的问题是我需要从阈值开始对每个字母进行迭代,而我被困在那里。 我更喜欢使用 startswith('AB')

最佳答案

首先,让我们定义您的字符串:

>>> m = ['ABA','ABB', 'ABC','BCA','BCB','BCC','ABBC', 'ABBA', 'ABBC']

现在,让我们计算所有长度为 2 或 3 的前导字符串:

>>> from collections import Counter
>>> c = Counter([s[:2] for s in m] + [s[:3] for s in m if len(s)>=3])

为了与您的表格进行比较,以下是三个最常见的前导字符串:

>>> c.most_common(3)
Out[15]: [('AB', 6), ('ABB', 4), ('BC', 3)]

更新

要包含最大长度 len(max(m, key=len))-1 的所有键:

>>> n = len(max(m, key=len))
>>> c = Counter(s[:i] for s in m for i in range(2, min(n, 1+len(s))))

附加测试

为了证明我们可以正确处理较长的字符串,让我们考虑不同的输入:

>>> m = ['ab', 'abc', 'abcdef']
>>> n = len(max(m, key=len))
>>> c = Counter(s[:i] for s in m for i in range(2, min(n, 1+len(s))))
>>> c.most_common()
[('ab', 3), ('abc', 2), ('abcd', 1), ('abcde', 1)]

关于python - 使用模式阈值识别单词列表中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58004629/

相关文章:

python - 为什么要从 Google App Engines 导入 urlfetch?

javascript - 为什么一个线性搜索给我的输出与另一个不同?

php - 使用数组自动生成更新表单

r - 将多个分组索引连接成一个

c++ - 我的 do while 循环只执行一次

php - Wordpress 查询帖子将每个项目包装在一个 div 而不是一个 li 中,并显示当前页面的后代

python - 设置我的远程 api

python - 提取 numpy 数组中每个元素的最后两位数字的有效方法

python - 在对 apply() 的调用中添加重复的数据框行

C++ 地址存在吗?