如果需要统计一段文本中每个词语出现次数,需要怎么做呢?
这里就要用到字典类型了,在字典中构成“元素:出现次数”的健值对,非常适合“统计元素次数”这样的问题。
下面就用一道例题,简单学习一下:
列表 ls 中存储了我国 39 所 985 高校所对应的学校类型,请以这个列表为数据变量,完善 Python 代码,统计输出各类型的数量。
ls = ["综合", "理工", "综合", "综合", "综合", "综合", "综合", "综合", "综合", "综合",\
"师范", "理工", "综合", "理工", "综合", "综合", "综合", "综合", "综合","理工",\
"理工", "理工", "理工", "师范", "综合", "农林", "理工", "综合", "理工", "理工", \
"理工", "综合", "理工", "综合", "综合", "理工", "农林", "民族", "军事"]
接下来详细说一下思考的步骤:
1、构建一个空字典
想要构成“元素:出现次数”的健值对,那首先肯定就是要先生成一个空字典。
d = { }
2、生成好空字典后,就要往里面“装”东西了。
如果要给上面那个空字典装东西,直接用索引和赋值配合增加元素:
例子:
>>> t["一周有几天"] = "7"
>>>print(t)
{‘一周有几天’:’7’}
同样方法,往d = { }添加元素,用word代表字典里的“健”,就是那些Is里的那些词:
d[word] = (心里活动:等。。于。。等于啥呢?)
这里要用到字典的一个操作方法:
d.get(key, default) # 如果健存在,返回的值就是这个健,如果不存在,那就返回default。
那就写出这个东西了:
d[word] = d.get(word, 0)
# 给字典d里添加元素,“健”是word,值是d.get(word, 0) 。
# d.get(word, 0) 的意思为:从字典d里找这个word,如果word存在,那就添加一个“word :word”健值对,如果不存在,那就增加了一个“word:0”健值对。
有点绕,慢慢理解下。
因为字典d是空的呀,那里面啥也没有,d.get(word, 0) 返回的肯定是 0 。
哎,哎,出现数字了啊,注意,虽然是个“0”。
另外一方面,给字典添加元素,也不能手动来吧,不现实。。
这个时候,当然就得让 for 循环出场了。
3、添加一个循环。
for word in ls:
d[word] = d.get(word, 0) + 1
让‘word’在Is里循环取值,比如第一次 word 从 Is 取到一个词, “综合”,
那d[word] = d.get(word, 0) 的结果,就是d[综合] = 0。d一开始是空的,现在有了健值对,变成了{'综合':'0'},
在给d.get(word, 0) 加个 1,就成了{'综合':'1'}。
好啦,现在我们知道了,“综合”这个词出现了 1 次。
喜大普奔~~~~~
如果word在Is里接下来取到的词不是“综合”,那就是重复以上步骤;
如果取到的词还是“综合”,因为健值对'综合':'1'已经在字典里了,所以d.get(word, 0) 的结果,就不是0啦,而是
d[综合] = 1
再加个1,那就是d[综合] = 2,因为字典的健不允许重复,值是可以重复的,所以这一步操作相当于对'综合':'1'进行了就修改,变成了
‘综合‘:’2‘
这回明白了吧,通过循环操作,两行代码就生成了一个字典,里面的健值对,就是词语及其出现的次数。
到了这一步,其实工作已经差不多了,以上全部代码为:
d = {}
for word in ls:
d[word] = d.get(word, 0) + 1
用print(d) 来输出结果:
{'综合': 20, '理工': 13, '师范': 2, '农林': 2, '民族': 1, '军事': 1}
4、换种输出形式
刚才显示的还是不太一目了然,如果出现的结果是以列的形式,那会直观一些。
怎么做?
还是用循环吧。
for k in d:
print("{}:{}".format(k, d[k]))
用 k 代表 字典里的 “健”,循环多次得到结果:
综合:20
理工:13
师范:2
农林:2
民族:1
军事:1
format()的使用这里就不说了,说简单也简单,说复杂也有点复杂,format的格式控制那些玩意儿不好整。
好啦,今天就记这么多吧,这道例题的全部代码如下:
d = {}
for word in ls:
d[word] = d.get(word, 0) + 1
for k in d:
print("{}:{}".format(k, d[k]))