如何在不使用内置函数count的情况下创建它。Python
我想要得到和这段代码完全一样的结果:
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 个回答
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)
这段代码的意思是……
首先,它会做一些初始化的工作,比如设置一些变量或者准备一些数据。接下来,它会进入一个循环,这个循环会重复执行某些操作,直到满足特定的条件为止。在循环内部,代码会根据不同的情况执行不同的任务,可能会有一些判断语句来决定接下来该做什么。
最后,当循环结束后,代码会进行一些收尾工作,比如输出结果或者清理资源。
总的来说,这段代码的结构是很常见的,主要是通过循环和条件判断来实现某个功能。
你可以通过创建一个字母的字典,来统计单词中每个字母出现的频率。
- 首先,创建一个字母字典,并把每个字母的初始值设为零。
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")
如果你在统计字符时,不区分大小写(也就是说,你认为 M
和 m
是同一个字符,而不是大写的 '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")
count
和 Counter
是常用的方法,但下面的代码也应该能正常工作。
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}
如果你想避免使用任何内置函数和像 get 这样的函数方法,你可以使用 try
和 catch
,这和 @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
换成了 try
和 except
。
另外,Counter 不是一个内置函数,而是一种数据类型,专门用于这种目的,至少我知道是这样的。