查找指定长度的大多数序列
Finding most sequences of specified length
我正在尝试编写 python 代码,该代码将接受一个字符串和一个长度,并搜索该字符串以告诉我该特定长度的哪个子字符串出现次数最多,优先考虑第一个 if有一条领带。
例如,"cadabra abra" 2
应该returnab
我试过了:
import sys
def main():
inputstring = str(sys.argv[1])
length = int(sys.argv[2])
Analyze(inputstring, length)
def Analyze(inputstring, length):
count = 0;
runningcount = -1;
sequence = ""
substring = ""
for i in range(0, len(inputstring)):
substring = inputstring[i:i+length]
for j in range(i+length,len(inputstring)):
#print(runningcount)
if inputstring[j:j+2] == substring:
print("runcount++")
runningcount += 1
print(runningcount)
if runningcount > count:
count = runningcount
sequence = substring
print(sequence)
main()
但似乎无法正常工作。我知道我至少在计数方面做错了,但我不确定是什么。这也是我在 Python 中的第一个程序,但我认为我的问题可能更多是算法而不是语法。
尝试使用内置方法,它们会让您的生活更轻松,这样:
>>> s = "cadabra abra"
>>> x = 2
>>> l = [s[i:i+x] for i in range(len(s)-x+1)]
>>> l
['ca', 'ad', 'da', 'ab', 'br', 'ra', 'a ', ' a', 'ab', 'br', 'ra']
>>> max(l, key=lambda m:s.count(m))
'ab'
编辑:
根据 Stefan Pochmann 评论更简单的语法:
>>> max(l, key=s.count)
import sys
from collections import OrderedDict
def main():
inputstring = sys.argv[1]
length = int(sys.argv[2])
analyze(inputstring, length)
def analyze(inputstring, length):
d = OrderedDict()
for i in range(0, len(inputstring) - length + 1):
substring = inputstring[i:i+length]
if substring in d:
d[substring] += 1
else:
d[substring] = 1
maxlength = max(d.values())
for k,v in d.items():
if v == maxlength:
print(k)
break
main()
第一个 Python 程序的解决方案相当不错。在学习这门语言时,请花一些时间阅读优秀的文档。它充满了示例和提示。
例如,标准库包括一个 Counter
class 用于计数(显然)和一个 OrderedDict
class 用于记住输入键的顺序.但是文档包含一个将两者结合起来形成 OrderedCounter
的示例,可用于解决您这样的问题:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
pass
def analyze(s, n):
substrings = (s[i:i+n] for i in range(len(s)-n+1))
counts = OrderedCounter(substrings)
return max(counts.keys(), key=counts.__getitem__)
analyze("cadabra abra", 2)
我正在尝试编写 python 代码,该代码将接受一个字符串和一个长度,并搜索该字符串以告诉我该特定长度的哪个子字符串出现次数最多,优先考虑第一个 if有一条领带。
例如,"cadabra abra" 2
应该returnab
我试过了:
import sys
def main():
inputstring = str(sys.argv[1])
length = int(sys.argv[2])
Analyze(inputstring, length)
def Analyze(inputstring, length):
count = 0;
runningcount = -1;
sequence = ""
substring = ""
for i in range(0, len(inputstring)):
substring = inputstring[i:i+length]
for j in range(i+length,len(inputstring)):
#print(runningcount)
if inputstring[j:j+2] == substring:
print("runcount++")
runningcount += 1
print(runningcount)
if runningcount > count:
count = runningcount
sequence = substring
print(sequence)
main()
但似乎无法正常工作。我知道我至少在计数方面做错了,但我不确定是什么。这也是我在 Python 中的第一个程序,但我认为我的问题可能更多是算法而不是语法。
尝试使用内置方法,它们会让您的生活更轻松,这样:
>>> s = "cadabra abra"
>>> x = 2
>>> l = [s[i:i+x] for i in range(len(s)-x+1)]
>>> l
['ca', 'ad', 'da', 'ab', 'br', 'ra', 'a ', ' a', 'ab', 'br', 'ra']
>>> max(l, key=lambda m:s.count(m))
'ab'
编辑:
根据 Stefan Pochmann 评论更简单的语法:
>>> max(l, key=s.count)
import sys
from collections import OrderedDict
def main():
inputstring = sys.argv[1]
length = int(sys.argv[2])
analyze(inputstring, length)
def analyze(inputstring, length):
d = OrderedDict()
for i in range(0, len(inputstring) - length + 1):
substring = inputstring[i:i+length]
if substring in d:
d[substring] += 1
else:
d[substring] = 1
maxlength = max(d.values())
for k,v in d.items():
if v == maxlength:
print(k)
break
main()
第一个 Python 程序的解决方案相当不错。在学习这门语言时,请花一些时间阅读优秀的文档。它充满了示例和提示。
例如,标准库包括一个 Counter
class 用于计数(显然)和一个 OrderedDict
class 用于记住输入键的顺序.但是文档包含一个将两者结合起来形成 OrderedCounter
的示例,可用于解决您这样的问题:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
pass
def analyze(s, n):
substrings = (s[i:i+n] for i in range(len(s)-n+1))
counts = OrderedCounter(substrings)
return max(counts.keys(), key=counts.__getitem__)
analyze("cadabra abra", 2)