最频繁的字符 - 没有字典或计数器的用户提交的字符串

时间:2016-11-12 08:36:34

标签: python string python-3.x

目前,我正在编写一个程序,用于计算用户提交的字符串中的所有非空白字符,然后返回最常用的字符。我不能使用集合,计数器或字典。这就是我想要做的事情:

拆分字符串以删除空格。然后计算每个字符并返回一个值。我想在这里发布一些内容,但到目前为止我所尝试的一切都遇到了严重的失败。我最接近的是这个节目:

nightmarejs

如果您可以修复此代码或告诉我更好的方法,以满足所需的标准,这将有所帮助。并且,在你说这个论坛已经在这个论坛上做了一百次之前,请注意我创建了一个专门用来提出这个问题的帐户。是的,有很多这样的问题,但有些问题是从文本文件或程序中的现有字符串中读取。其中绝大多数包含字典,计数器或集合,我在本章中目前无法使用。

3 个答案:

答案 0 :(得分:2)

就这样做“旧方式”。创建一个列表(好吧它是一个集合,但是一个非常基本的集合,所以不应该是一个问题)26个零并根据位置增加。同时计算最大索引。

strin="lazy cat dog whatever"
l=[0]*26

maxindex=-1
maxvalue=0
for c in strin.lower():
    pos = ord(c)-ord('a')
    if 0<=pos<=25:
        l[pos]+=1
        if l[pos]>maxvalue:
            maxindex=pos
            maxvalue = l[pos]

print("max count {} for letter {}".format(maxvalue,chr(maxindex+ord('a'))))

结果:

max count 3 for letter a

答案 1 :(得分:0)

作为Jean解决方案的替代方案(不使用允许对字符串进行一次传递的列表),您可以在这里使用str.count,这几乎可以解决您尝试过的问题要做:

strin = input("Enter a string: ").strip()
maxcount = float('-inf')
maxchar = ''
for char in strin:
    c = strin.count(char) if not char.isspace() else 0
    if c > maxcount:
        maxcount = c
        maxchar = char
print("Char {}, Count {}".format(maxchar, maxcount))

如果有可用的列表,我会使用Jean的解决方案。他没有使用O(N)函数N次: - )

P.s:如果你使用max

,你可以用一行压缩它
max(((strin.count(i), i) for i in strin if not i.isspace()))

答案 2 :(得分:0)

要跟踪不同字符的多个计数,您必须使用集合(即使它是在Python中作为字典实现的全局命名空间)。

在支持任意Unicode字符串的同时打印最常用的非空格字符:

import sys

text = input("Enter a string (case is ignored)").casefold() # default caseless matching

# count non-space character frequencies
counter = [0] * (sys.maxunicode + 1)
for nonspace in map(ord, ''.join(text.split())):
    counter[nonspace] += 1

# find the most common character
print(chr(max(range(len(counter)), key=counter.__getitem__)))

Cython中的类似列表是the fastest way to find frequency of each character