我正在尝试制作一个基本上有一个输入字符串的程序,程序应该做的是输出最多出现的字符并说出它发生了多少次。它还输出出现次数最少的字符,并说出它出现的次数。
我很难开始这个,因为我在夏季大学课程的一部分时这样做,因此它在6个星期内完成了整个学期的课程,因此课程进展非常快。有人可以帮我解释一下这背后的逻辑,这样我就可以开始了吗?
我们还没有学到很多不同的方法,所以如果你坚持使用基本的python编程就可以了。 < - 像while循环和for循环我们学习,列表,元组,字符串等。我们没有学到任何其他东西..
由于
答案 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]
如果这些字母出现频率最高且最少出现多久?现在,我知道我需要跟踪额外信息,因为我认为第一个字母是最小值和最大值将此字母的计数设为min
和max
。
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次。答案永远不会改变。它也会多次遍历字符串 -
答案 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
我想让剩下的让你解决,因为获得元素的数量是最大的障碍。你也可以从中获得最大和最小值。