计算所有字符,然后打印多少个字符

时间:2013-07-28 17:20:35

标签: python

在Python中,我需要编写一个程序:

要求用户输入字符串文本。 它会为文本中的每个字母打印出文本中出现的次数。 在打印输出中,字母应按照它们在文本中出现的顺序出现,但不应出现两次字母。 对于任何字母,您应该以大写或小写显示它显示的总次数(不要分别计数或显示大写和小写)。 还应计算空格和标点字符。 例如:

输入“你好世界!”它应该打印:

h: 1
e: 1
l: 3
o: 2
    : 1
w: 1
r: 1
d: 1
!: 1

输入'今天是星期二'应该打印:

t: 3
o: 1
d: 2
a: 2
y: 2
    : 3
i: 2
s: 2
u: 1
e: 1

我很新,我不知道该怎么做。

4 个答案:

答案 0 :(得分:7)

您提到它应该是有序的,因此您可以从collections文档中获取OrderedCounter食谱,例如:

from collections import OrderedDict, Counter

class OrderedCounter(Counter, OrderedDict):
     'Counter that remembers the order elements are first encountered'

     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

     def __reduce__(self):
         return self.__class__, (OrderedDict(self),)

letter_counts = OrderedCounter('hello world!')
# OrderedCounter(OrderedDict([('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1), ('!', 1)]))

然后jout循环:

for letter, count in letter_counts.items():
    print letter, count

答案 1 :(得分:4)

使用collections.Counter

>>> from collections import Counter
>>> Counter('hello world!')
Counter({'l': 3, 'o': 2, '!': 1, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})

没有注意到您要保留订单。为此,您可以使用collections模块文档中的OrderedCounter示例:

>>> from collections import OrderedDict
>>> 
>>> class OrderedCounter(Counter, OrderedDict):
...     def __repr__(self):
...         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
...     def __reduce__(self):
...         return self.__class__, (OrderedDict(self),)
... 
>>> 
>>> count = OrderedCounter('hello world!')
>>> count
OrderedCounter(OrderedDict([('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1), ('!', 1)]))

答案 2 :(得分:0)

听起来像家庭作业,在这种情况下collections.Counter可能无法使用,以及为什么值得给出一些指导而不是答案:

首先,您需要计算唯一值。如果您有一些输入,您如何获得唯一的值?

答案:使用一套。

>>> sample = [1, 3, 6, 7, 7, 7, 7, 8]
>>> set(sample)
{8, 1, 3, 6, 7}
# Notice: the order has been thrown away
>>> newsample = 'LollaPAloOza'
>>> set(newsample)
{'a', 'A', 'L', 'l', 'o', 'O', 'z', 'P'}
# Notice: lowercase and uppercase are treated as different characters. 

新问题:我们如何对待小写和大写相同?

答案:修改整个输入以使其为小写或大写:

>>> set(newsample.lower())
{'a', 'p', 'z', 'l', 'o'}

我们现在有一组值得统计的唯一值。下一个问题:我们如何计算这些东西?

答案:我们可以遍历集合(使用for循环),然后计算集合中的每个项目:

my_input = newsample.lower()
for item in set(my_input):
      print(my_input.count(item))
# the trick here is to iterate through the unique values and for each element,
# to count the item that appears in the _whole_ (now lowercase) input.

最后,我们必须创建一些数据结构来保存项目的计数。字典将是这样做的好方法,或者因为你需要按照它们出现的顺序得到答案,我建议你研究建立一个列表并将每个计数与列表中的每个项目联系起来。

但是,如果您可以使用它,则所有这些工作都由collections.Counter执行。

答案 3 :(得分:0)

虽然两个答案都提供了OrderedCounter的很好的例子,但我仍然认为它不是问题的完整答案,因为新类应该将字母转换为小写字母。这里的Sor是我的2美分:

from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict):
     'Counter that remembers the order elements are first encountered'
     def __init__(self, iterable, **kwds):
         if "lower" in dir(iterable): it = iterable.lower()
         else: it = iterable

         return super(OrderedCounter, self).__init__(it, **kwds)

     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

     def __reduce__(self):
         return self.__class__, (OrderedDict(self),)