重叠出现的字符串计数[关闭]

2024-11-29 08:42:00
admin
原创
91
摘要:问题描述:在 Python 中,计算给定字符串出现次数(包括重叠)的最佳方法是什么?这是一种方法:def function(string, str_to_search_for): count = 0 for x in xrange(len(string) - len(str_to_se...

问题描述:

在 Python 中,计算给定字符串出现次数(包括重叠)的最佳方法是什么?这是一种方法:

def function(string, str_to_search_for):
      count = 0
      for x in xrange(len(string) - len(str_to_search_for) + 1):
           if string[x:x+len(str_to_search_for)] == str_to_search_for:
                count += 1
      return count


function('1011101111','11')

此方法返回 5。

Python 中有没有更好的方法?


解决方案 1:

嗯,这可能更快,因为它在 C 中进行比较:

def occurrences(string, sub):
    count = start = 0
    while True:
        start = string.find(sub, start) + 1
        if start > 0:
            count+=1
        else:
            return count

解决方案 2:

>>> import re
>>> text = '1011101111'
>>> len(re.findall('(?=11)', text))
5

如果您不想将整个匹配列表加载到内存中,这永远不会是个问题!如果您真的想要,您可以这样做:

>>> sum(1 for _ in re.finditer('(?=11)', text))
5

作为一个函数(re.escape确保子字符串不会干扰正则表达式):

def occurrences(text, sub):
    return len(re.findall('(?={0})'.format(re.escape(sub)), text))
>>> occurrences(text, '11')
5

解决方案 3:

您还可以尝试使用新的 Python regex 模块,它支持重叠匹配。

import regex as re

def count_overlapping(text, search_for):
    return len(re.findall(search_for, text, overlapped=True))

count_overlapping('1011101111','11')  # 5

解决方案 4:

Pythonstr.count计算不重叠的子字符串:

In [3]: "ababa".count("aba")
Out[3]: 1

这里列出了一些计算重叠序列的方法,我相信还有很多其他方法:)

前瞻正则表达式

如何用正则表达式找到重叠匹配?

In [10]: re.findall("a(?=ba)", "ababa")
Out[10]: ['a', 'a']

生成所有子字符串

In [11]: data = "ababa"
In [17]: sum(1 for i in range(len(data)) if data.startswith("aba", i))
Out[17]: 2

解决方案 5:

s = "bobobob"
sub = "bob"
ln = len(sub)
print(sum(sub == s[i:i+ln] for i in xrange(len(s)-(ln-1))))

解决方案 6:

def count_substring(string, sub_string):
    count = 0
    for pos in range(len(string)):
        if string[pos:].startswith(sub_string):
            count += 1
    return count

这可能是最简单的方法。

解决方案 7:

一种相当 Python 化的方法是在这里使用列表理解,尽管它可能不是最有效的。

sequence = 'abaaadcaaaa'
substr = 'aa'

counts = sum([
    sequence.startswith(substr, i) for i in range(len(sequence))
])
print(counts)  # 5

该列表将是[False, False, True, False, False, False, True, True, False, False]由于它检查了字符串中的所有索引,并且因为int(True) == 1,所以sum给出了匹配的总数。

解决方案 8:

针对课程中提到的问题,我的回答是:

s = 'azcbobobegghaklbob'
total = 0
for i in range(len(s)-2):
    if s[i:i+3] == 'bob':
        total += 1
print 'number of times bob occurs is: ', total

解决方案 9:

如何在另一个重叠的字符串中查找模式

此函数(另一种解决方案!)接收一个模式和一个文本。返回一个列表,其中包含位于的所有子字符串及其位置。

def occurrences(pattern, text):
    """
    input: search a pattern (regular expression) in a text
    returns: a list of substrings and their positions 
    """
    p = re.compile('(?=({0}))'.format(pattern))
    matches = re.finditer(p, text)
    return [(match.group(1), match.start()) for match in matches]

print (occurrences('ana', 'banana'))
print (occurrences('.ana', 'Banana-fana fo-fana'))

[('ana', 1), ('ana', 3)]

[('Bana', 0), ('nana', 2), ('fana', 7), ('fana', 15)]

解决方案 10:

这里是我的 edX MIT “查找 bob” 解决方案(查找名为 s 的字符串中“bob”出现的次数),它基本上计算给定替换的重叠出现次数:

s = 'azcbobobegghakl'
count = 0

while 'bob' in s:
    count += 1 
    s = s[(s.find('bob') + 2):]

print "Number of times bob occurs is: {}".format(count)

解决方案 11:

另一种方法非常接近公认的答案,但是用作while测试if而不是包含if在循环内:

def countSubstr(string, sub):
    count = 0
    while sub in string:
        count += 1
        string = string[string.find(sub) + 1:]
    return count;

我认为这可以避免while True:并且更干净一些

解决方案 12:

如果字符串很大,则需要使用Rabin-Karp,总结一下:

  • 子字符串大小的滚动窗口,在字符串上移动

  • 添加和删​​除(即移动 1 个字符)的哈希开销为 O(1)

  • 用 C 实现或依赖 pypy

解决方案 13:

可以使用正则表达式来解决。

import re
def function(string, sub_string):
    match = re.findall('(?='+sub_string+')',string)
    return len(match)

解决方案 14:

def count_substring(string, sub_string):
    counter = 0
    for i in range(len(string)):
        if string[i:].startswith(sub_string):
        counter = counter + 1
    return counter

上面的代码只是循环遍历字符串一次并不断检查是否有任何字符串以正在计算的特定子字符串开头。

解决方案 15:

re.subn尚未提及:

>>> import re
>>> re.subn('(?=11)', '', '1011101111')[1]
5

解决方案 16:

用替换字符串部分内容的解决方案

s = 'lolololol'
t = 0
t += s.count('lol')
s = s.replace('lol', 'lo1')
t += s.count('1ol')
print("Number of times lol occurs is:", t)

答案是 4。

解决方案 17:

def count_overlaps (string, look_for):
    start   = 0
    matches = 0

    while True:
        start = string.find (look_for, start)
        if start < 0:
            break

        start   += 1
        matches += 1

    return matches

print count_overlaps ('abrabra', 'abra')

解决方案 18:

函数以两个字符串作为输入,并计算 sub 在字符串中出现的次数(包括重叠)。为了检查 sub 是否为子字符串,我使用了in运算符。

def count_Occurrences(string, sub):
    count=0
    for i in range(0, len(string)-len(sub)+1):
        if sub in string[i:i+len(sub)]:
            count=count+1
    print 'Number of times sub occurs in string (including overlaps): ', count

解决方案 19:

对于重复的问题,我决定将其 3 乘 3 进行计数,然后比较字符串,例如

counted = 0

for i in range(len(string)):

    if string[i*3:(i+1)*3] == 'xox':
       counted = counted +1

print counted

解决方案 20:

这是另一个使用示例str.find(),但许多答案使其变得比必要的更复杂:

def occurrences(text, sub):
    c, n = 0, text.find(sub)
    while n != -1:
        c += 1
        n = text.find(sub, n+1)
    return c

In []:
occurrences('1011101111', '11')

Out[]:
5

解决方案 21:

鉴于

sequence = '1011101111'
sub = "11"

代码

在这个特殊案例中:

sum(x == tuple(sub) for x in zip(sequence, sequence[1:]))
# 5

更一般地,这

windows = zip(*([sequence[i:] for i, _ in enumerate(sequence)][:len(sub)]))
sum(x == tuple(sub) for x in windows)
# 5

或者扩展到发电机:

import itertools as it


iter_ = (sequence[i:] for i, _ in enumerate(sequence))
windows = zip(*(it.islice(iter_, None, len(sub))))
sum(x == tuple(sub) for x in windows)

选择

您可以使用more_itertools.locate

import more_itertools as mit


len(list(mit.locate(sequence, pred=lambda *args: args == tuple(sub), window_size=len(sub))))
# 5

解决方案 22:

计算子字符串出现次数的一个简单方法是使用count()

>>> s = 'bobob'
>>> s.count('bob')
1

replace ()如果您知道哪部分会重叠,您可以使用它来查找重叠的字符串:

>>> s = 'bobob'
>>> s.replace('b', 'bb').count('bob')
2

请注意,除了静态之外,还有其他限制:

>>> s = 'aaa'
>>> count('aa') # there must be two occurrences
1 
>>> s.replace('a', 'aa').count('aa')
3

解决方案 23:

def occurance_of_pattern(text, pattern):
    text_len , pattern_len = len(text), len(pattern)
    return sum(1 for idx in range(text_len - pattern_len + 1) if text[idx: idx+pattern_len] == pattern) 

解决方案 24:

我想看看相同前缀字符的输入数量是否与后缀相同,例如,"foo""""foo""失败了"""bar""

from itertools import count, takewhile
from operator import eq


# From https://stackoverflow.com/a/15112059
def count_iter_items(iterable):
    """
    Consume an iterable not reading it into memory; return the number of items.

    :param iterable: An iterable
    :type iterable: ```Iterable```

    :return: Number of items in iterable
    :rtype: ```int```
    """
    counter = count()
    deque(zip(iterable, counter), maxlen=0)
    return next(counter)


def begin_matches_end(s):
    """
    Checks if the begin matches the end of the string

    :param s: Input string of length > 0
    :type s: ```str```

    :return: Whether the beginning matches the end (checks first match chars
    :rtype: ```bool```
    """
    return (count_iter_items(takewhile(partial(eq, s[0]), s)) ==
            count_iter_items(takewhile(partial(eq, s[0]), s[::-1])))

解决方案 25:

如果要计算长度为 5 的排列计数(如果需要不同的长度,请进行调整):

def MerCount(s):
  for i in xrange(len(s)-4):
    d[s[i:i+5]] += 1
return d
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1048  
  在产品开发领域,如何提升产品交付质量一直是企业关注的焦点。集成产品开发(IPD)作为一种系统化的产品开发方法,通过跨职能团队的协同、流程的优化以及资源的整合,能够有效提升产品的交付质量。IPD培训作为推动这一方法落地的重要工具,不仅能够帮助团队理解IPD的核心原则,还能通过实践和案例学习,提升团队的执行力和协作效率。本...
IPD研发管理体系   0  
  在现代企业中,跨部门合作已成为项目成功的关键因素之一。随着业务复杂性的增加,单一部门难以独立完成复杂的项目任务,因此需要多个部门的协同努力。然而,跨部门合作往往面临沟通不畅、职责不清、资源冲突等挑战,这些问题如果得不到有效解决,将直接影响项目的进度和质量。在这种背景下,IPD(集成产品开发)项目流程图作为一种系统化的管...
华为IPD流程   0  
  在研发IPD(集成产品开发)流程中,跨部门协作是确保项目成功的关键因素之一。IPD流程强调从概念到市场的全生命周期管理,涉及市场、研发、制造、供应链等多个部门的协同工作。然而,由于各部门的目标、工作方式和优先级不同,跨部门协作往往面临沟通不畅、资源冲突、决策延迟等挑战。为了应对这些挑战,企业需要采取系统化的方法,优化跨...
IPD概念阶段   0  
  在项目管理的生命周期中,CDCP(Concept Development and Control Plan)阶段是项目从概念到实施的关键过渡期。这一阶段不仅需要明确项目的目标和范围,还需要确保项目团队能够灵活应对可能出现的变更和调整。变更管理在这一阶段尤为重要,因为任何未经控制的变更都可能对项目的进度、成本和质量产生深...
IPD流程中TR   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用