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

2024-05-16 21:25:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 函数字符串列表ab模式计数器数组abc
3条回答

使用collections.Counter

counter = collections.Counter()
min_length = 2
max_length = len(max(m, key=len))
for length in range(min_length, max_length):
    counter.update(word[:length] for word in m if len(word) >= length)

您可以使用函数accumulate()来生成累积字符串,使用函数islice()来获得最小长度的字符串:

from itertools import accumulate, islice
from collections import Counter

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

c = Counter()
for i in map(accumulate, m):
    c.update(islice(i, 1, None)) # get strings with a minimal length of 2

print(c.most_common(3))
# [('AB', 6), ('ABB', 4), ('BC', 3)]

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

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

相关问题 更多 >