计算最多和最不常见的非空格字符的程序

时间:2013-07-01 03:27:48

标签: python

我正在尝试制作一个基本上有一个输入字符串的程序,程序应该做的是输出最多出现的字符并说出它发生了多少次。它还输出出现次数最少的字符,并说出它出现的次数。

我很难开始这个,因为我在夏季大学课程的一部分时这样做,因此它在6个星期内完成了整个学期的课程,因此课程进展非常快。有人可以帮我解释一下这背后的逻辑,这样我就可以开始了吗?

我们还没有学到很多不同的方法,所以如果你坚持使用基本的python编程就可以了。 < - 像while循环和for循环我们学习,列表,元组,字符串等。我们没有学到任何其他东西..

由于

4 个答案:

答案 0 :(得分:6)

from collections import Counter
the_string = "This is a string!"
Counter(x for x in the_string if not x.isspace()).most_common()

这是一种没有Counters / dicts / etc的方法。

>>> the_string = "This is a string!"
>>> A = [0] * 256
>>> for x in the_string:
...     if not x.isspace():
...         A[ord(x)] += 1
... 

ord()将每个字符映射到A

中的某个位置
>>> A
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

您可以轻松找到一个这样的最常见字符

>>> chr(A.index(max(A)))
'i'

最小值更复杂,因为我们需要的最小值不是0

>>> chr(A.index(min(x for x in A if x)))
'!'

好的,您可能对max和min以及生成器表达式感到不舒服,但是您应该能够在6周后使用for循环来解决这个问题

答案 1 :(得分:4)

您可以使用collections.Counter

>>> Counter(''.join("This is a string!".split())).most_common()
[('i', 3), ('s', 3), ('a', 1), ('!', 1), ('g', 1), ('h', 1), ('n', 1), ('r', 1), ('T', 1), ('t', 1)]

或者,出于学习目的,您可以使用for循环和字典来保持计数:

mystring = ''.join("This is a string!".split())
mydict = {}
for char in mystring:
    if char not in mydict:
        mydict[char] = 1
    else:
        mydict[char] += 1

print mydict
# {'a': 1, '!': 1, 'g': 1, 'i': 3, 'h': 1, 'n': 1, 's': 3, 'r': 1, 'T': 1, 't': 1}
print max(mydict.items(), key=lambda x: x[1])[0]
# i

max()从对象获取最大值。我们传递一个关键参数,因为我们正在使用字典。

mydict.items()返回一个元组列表,其中键和值在一个元组中。

key=lambda x: x[1]告诉python查看元组中的第二项,因为这是我们想要的数字。最后,[0]用于获取密钥。

mydict.items看起来像这样:

  

[('a',1),('!',1),('g',1),('i',3),('h',1),('n',1 ),('s',3),('r',1),('T',1),('t',1)]

这就像字典的解压缩版本。


对于最不常见的,只需使用min() :)。蟒蛇不是很有趣吗?

答案 2 :(得分:4)

我喜欢挑战。没有复杂的数据结构,只有简单的循环和ifs。如果这太复杂了,那么你的老师做得不好!

w = "This is the song that doesn't end; yes it goes on and on my friend."
max_letter = w[0]
min_letter = w[0]
max = w.count(w[0])
min = w.count(w[0])
for c in w:
    if c is not " ":
        if w.count(c) > max:
            max_letter = c
            max = w.count(c)
        if w.count(c) < min:
            min_letter = c
            min = w.count(c)

print max, max_letter
print min, min_letter

>>> 7 n
>>> 1 T
@Rohan问我是如何构建它的,我唯一公平的描述它。 Basicaly,它是一个回答问题,并在我经历过时提出新问题的练习。

最大和最小字母是什么?您首先要知道的是您需要找到并打印一些东西。那些东西是最小和最大字母。在一切开始时,我知道第一个字母将是两个,所以让我们从那里开始。 应该说,如果字符串为空会发生什么?

max_letter = w[0]
min_letter = w[0]

如果这些字母出现频率最高且最少出现多久?现在,我知道我需要跟踪额外信息,因为我认为第一个字母是最小值和最大值将此字母的计数设为minmax

max = w.count(w[0])
min = w.count(w[0])

我怎么知道这些字母真的是最不常见的?好吧,我需要检查所有字母,我可以循环执行此操作:

for c in w:

这是我正在检查的当前角色吗?在这种情况下,我只想要不是空格的东西,但我可以在这里查看任何内容。

    if c is not " ":

这个当前的字母是最常见的吗?不确定,所以请检查最大值,如果是,则更新具有最大计数的字母,以及最大计数是多少。 / p>

        if w.count(c) > max:
            max_letter = c
            max = w.count(c)

最不常见的相同......

        if w.count(c) < min:
            min_letter = c
            min = w.count(c)

然后打印出我发现的内容

print max, max_letter
print min, min_letter

此算法可以更好吗?是的。此算法检查'n'是否为最大字母数7次。答案永远不会改变。它也会多次遍历字符串 -

  • for循环中每个字母一次
  • 在一个简单的计数算法中,它会在每次迭代中再次运行以获得计数。

答案 3 :(得分:1)

使用字典和一些检索密钥的方法可以直接解决这个问题。字典保证有唯一的密钥,但不保证它们的顺序。

d = dict()
w = "This is the song that doesn't end; yes it goes on and on my friend."
for letter in w:
    if d.get(letter) is not None:
        d[letter] += 1
    else:
        d[letter] = 1

我想让剩下的让你解决,因为获得元素的数量是最大的障碍。你也可以从中获得最大和最小值。