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

2024-09-30 01:32:34 发布

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

我正在尝试编写python代码,该代码将包含一个字符串和一个长度,并搜索该字符串以告诉我该特定长度的哪个子字符串出现得最多,如果出现并列关系,则优先考虑第一个。你知道吗

例如,"cadabra abra" 2应该返回ab

我试过:

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编写的第一个程序,但我认为我的问题可能更多的是算法而不是语法。你知道吗


Tags: 字符串代码formaindefcountsyssubstring
3条回答
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()

尝试使用内置方法,它们会让您的生活更轻松,方法如下:

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

为第一个Python程序提供了一个很好的解决方案。当你学习这门语言时,花一些时间阅读优秀的文档。它充满了例子和技巧。你知道吗

例如,标准库包括一个Counter类(显然)和一个OrderedDict类,用于计算输入的键的顺序。但是文档中有一个例子,它将两者结合起来形成一个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)

相关问题 更多 >

    热门问题