查找指定长度的大多数序列

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)