3

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

我在开始时遇到了麻烦,因为我在暑期大学课程的一部分中这样做,所以它在 6 周内完成了整个学期的课程,所以课程进行得非常快。有人可以为我解释一下这背后的逻辑,这样我就可以开始了吗?

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

谢谢

4

4 回答 4

7
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 以及生成器表达式不满意,但是您应该能够for在 6 周后通过循环来解决问题

于 2013-07-01T03:41:52.300 回答
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():)。蟒蛇不好玩吗?

于 2013-07-01T03:33:12.323 回答
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 问我是如何建立这个的,我描述它是唯一公平的。基本上,它是一种回答问题的练习,并在我经历的过程中提出新的问题。

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

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

如果这些字母出现次数最多和最少,它们出现的频率是多少?现在,我知道我需要跟踪额外的信息,并且由于我决定第一个字母是最小值和最大值,因此将此字母的计数设置为minand max

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

这个算法可以更好吗?是的。该算法检查是否'n'是最大字母 7 次。答案永远不会改变。它还多次贯穿字符串-

  • for循环中的每个字母一次
  • 在一个简单的计数算法中,它会在每次迭代中再次运行以获取计数。
于 2013-07-01T04:06:51.910 回答
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

我想把剩下的留给你解决,因为获取元素的数量是最大的障碍。您也可以从中相对容易地获得最大值和最小值。

于 2013-07-01T03:38:02.317 回答