如何在不使用内置函数count的情况下创建它。Python

-1 投票
4 回答
7019 浏览
提问于 2025-04-30 13:37

我想要得到和这段代码完全一样的结果:

def histogram(s):
    d = {}

    for w in s: 
        d[w] = s.count(w)

    for k in sorted(d):
        print (k + ': ' + str(d[k]))

但是我不想使用任何内置函数。我只想用 len()、range()、chr() 和 ord() 这几个函数。

当输入“Mississippi”这个词时,这个程序的结果是:

M: 1
i: 4
p: 2
s: 4

要把它全部清理干净!

请写一个名为 histogram(s) 的函数,它接受一个字符串作为参数,并返回一个列表,列表中包含每个字符出现的次数。

还需要实现一个名为 histprint 的函数,它接受 histogram(s) 返回的列表,并在屏幕上打印一个表格,显示字符串中所有的字符。结果应该看起来像这样:

>>> h=histogram('Mississippi') 
>>> histprint(h) 
M: 1 
i: 4 
p: 2 
s: 4

不能使用任何内置函数!

暂无标签

4 个回答

0
def histogram(s):
    d = {}    
    for i in s:
        try:
            d[i] += 1
        except KeyError:
            d[i] = 1
    # Do you want to implement sorting also without inbuilt method ?
    # Not added sorting here ! `sorted(d)` will give the sorted keys.
    for k, v in d.iteritems():
        print "{} : {}".format(k, v)

这段代码的意思是……

首先,它会做一些初始化的工作,比如设置一些变量或者准备一些数据。接下来,它会进入一个循环,这个循环会重复执行某些操作,直到满足特定的条件为止。在循环内部,代码会根据不同的情况执行不同的任务,可能会有一些判断语句来决定接下来该做什么。

最后,当循环结束后,代码会进行一些收尾工作,比如输出结果或者清理资源。

总的来说,这段代码的结构是很常见的,主要是通过循环和条件判断来实现某个功能。

0

你可以通过创建一个字母的字典,来统计单词中每个字母出现的频率。

  • 首先,创建一个字母字典,并把每个字母的初始值设为零。
import string
d= dict.fromkeys(string.ascii_letters, 0) 
#d= dict(zip(string.ascii_letters, [0]*52))  # string.ascii_letters: should give you a list of  alphabets (UPPER case,lower case).

注意:查看注释

Output: 
{'A': 0, 'C': 0, 'B': 0, 'E': 0, 'D': 0, 'G': 0, 'F': 0, 'I': 0, 'H': 0, 'K': 0, 'J': 0, 'M': 0, >'L': 0, 'O': 0, 'N': 0, 'Q': 0, 'P':

0, 'S': 0, 'R': 0, 'U': 0, 'T': 0, 'W': 0, 'V': 0, 'Y': 0, 'X': 0, 'Z': 0, 'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0, 'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0, 't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}

  • 然后,遍历每个字符,每当找到一个字母,就把它的计数加 +1
w= "Mississippi"
for x in list(w):
  d[x]+=1

l= {}
for (key, value) in d.iteritems():
  if value>0:
    print key:value

输出结果:

M : 1
i : 4
p : 2
s : 4

所以你的函数应该是:

def histprint(w):
  d= dict.fromkeys(string.ascii_letters, 0)

  for x in list(w):
    d[x]+=1

  l= {}
  for (key, value) in d.iteritems():
    if value>0:
      print key,':',value


histprint("Mississippi")

如果你在统计字符时,不区分大小写(也就是说,你认为 Mm 是同一个字符,而不是大写的 'M' 或小写的 'm'),

你的算法看起来会是这样的:

import string

def histprint(w):
  d= dict.fromkeys(string.ascii_lowercase, 0)

  for x in list(w.lower()):
    d[x]+=1

  l= {}
  for (key, value) in d.iteritems():
    if value>0:
      print key,':',value


histprint("Mississippi")
1

countCounter 是常用的方法,但下面的代码也应该能正常工作。

my = "stackoverflow"
d={}
for l in my:
        d[l] = d.get(l,0) + 1 
print d

{'a': 1, 'c': 1, 'e': 1, 'f': 1, 'k': 1, 'l': 1, 'o': 2, 's': 1, 'r': 1, 't': 1, 'w': 1, 'v': 1}
1

如果你想避免使用任何内置函数和像 get 这样的函数方法,你可以使用 trycatch,这和 @d-coder 的回答是一样的。

基本上,你可以这样做:

def histogram(word):
    counter = {}
    for char in word:
        try:
            counter[char] = counter[char] + 1
        except KeyError:
            counter[char] = 1
    return counter

def histprint(h):
    for k in h:
        print k, h[k]

这个回答和上面的没有什么不同,只是把 get 换成了 tryexcept

另外,Counter 不是一个内置函数,而是一种数据类型,专门用于这种目的,至少我知道是这样的。

撰写回答