在 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/