【发布时间】:2013-04-03 13:54:55
【问题描述】:
我正在尝试在主字符串(所有长度)中查找所有出现的子字符串。我的函数接受一个字符串,然后返回每个子字符串的字典(当然,它出现多次)以及它出现的次数(字典格式:{substring: # of occurrences, ...})。我正在使用collections.Counter(s) 来帮助我。
这是我的功能:
from collections import Counter
def patternFind(s):
patterns = {}
for index in range(1, len(s)+1)[::-1]:
d = nChunks(s, step=index)
parts = dict(Counter(d))
patterns.update({elem: parts[elem] for elem in parts.keys() if parts[elem] > 1})
return patterns
def nChunks(iterable, start=0, step=1):
return [iterable[i:i+step] for i in range(start, len(iterable), step)]
我有一个字符串data,其中包含大约 2500 个随机字母(以随机顺序)。但是,其中插入了 2 个字符串(随机点)。假设这个字符串是'TEST'。 data.count('TEST') 返回 2。但是,patternFind(data)['TEST'] 给了我一个 KeyError。因此,我的程序没有检测到其中的两个字符串。
我做错了什么?谢谢!
编辑:我创建测试实例的方法:
def createNewTest():
n = randint(500, 2500)
x, y = randint(500, n), randint(500, n)
s = ''
for i in range(n):
s += choice(uppercase)
if i == x or i == y: s += "TEST"
return s
【问题讨论】:
-
你能说明你是如何在你的字符串中插入“TEST”的吗?你的代码似乎对我来说很完美。我用
s = [random.choice(string.letters+string.digits) for i in range(2500)]创建了一个测试字符串,然后使用s[ind:ind+4] = "TEST"在几个地方插入了“TEST”,并用s = ''.join(s)将列表加入到一个字符串中。打电话给out = patternFind(s)给了我一个out['TEST'] == 2的字典。 -
@Vorticity 用我创建字符串的方式编辑了我的代码。我用 100 根弦试了一下,只有 29 根是正确的。有时有效,有时无效。
-
我想我的第一个回复是错误的。代码不能按原样工作。我现在没有时间了,但至少我可以给你一个提示。开始使用更短的字符串(比如
n = randint(20, 40))并在每次循环中打印parts。你会发现你并没有考虑所有的可能性。您的查找程序将变得更加复杂,我认为您最好尝试回到最初的问题并找出您真正在寻找的是什么。 -
或者,看起来 mezzomondo 可能会给你一个很好的答案。
-
+1 激发了这场“竞赛”:)