首先表扬评论区这位网友,自己主动想到另一种写法,看得出来Python基础学得很扎实,会独立思考代码优化。
清理标点、切割字符串的逻辑上期视频讲过,今天放出两套完整、独立可以直接运行的代码,分开对比讲解。
第一种:书本标准完整代码
python
s="jingle bells,jingle bells,jingle all the way! \
jingle bells,jingle bells,jingle all the way! \
Oh what fun it is to ride in a one-horse open sleigh."
for ch in ",!.:":
s=s.replace(ch," ")
s=s.split()
s1=set(s)
s1=list(s1)
dict1=dict.fromkeys(s1,0)
for i in s:
dict1[i]+=1
for w,n in dict1.items():
print(f"{w}:{n}")
我们把核心统计代码提取出来单独看:
python
s1=set(s)
s1=list(s1)
dict1=dict.fromkeys(s1,0)
for i in s:
dict1[i]+=1
for w,n in dict1.items():
print(f"{w}:{n}")
重点讲解核心函数 dict.fromkeys()
函数格式: dict.fromkeys(序列,初始数值)
大白话通俗讲解:
1. 经过set去重之后,s1里面存放所有不重复的单词。
2. 关键重点:不需要我们手动写循环一个个添加单词!
只要调用 dict.fromkeys(s1,0) 这一行代码,函数内部自带循环,自动遍历s1里面每一个单词。
自动把单词当成字典的键,统一全部赋值数字0,直接生成字典:
{"jingle":0,"bells":0,"all":0......}
3. 好处:所有单词提前全部放进字典。
后面 dict1[i] +=1 直接累加数字,字典里一定存在这个单词,不会出现程序报错。
书本整套思路:
先把所有不重复单词找出来,调用函数一次性建好完整字典,计数全部初始化为0,最后遍历所有单词统计次数。
第二种:网友进阶完整代码
python
s="jingle bells,jingle bells,jingle all the way! \
jingle bells,jingle bells,jingle all the way! \
Oh what fun it is to ride in a one-horse open sleigh."
for ch in ",!.:":
s=s.replace(ch," ")
s=s.split()
dict1={}
for i in s:
dict1[i]=dict1.get(i,0)+1
for w,n in dict1.items():
print(f"{w}:{n}")
提取网友方案核心统计代码:
python
dict1={}
for i in s:
dict1[i]=dict1.get(i,0)+1
for w,n in dict1.items():
print(f"{w}:{n}")
重点讲解核心函数 dict.get()
函数格式: 字典.get(要查找的键,找不到时候的默认值)
大白话通俗讲解:
1. 程序循环读取每一个单词,去字典里面查找这个单词。
2. 如果字典里面找到了这个单词,就取出当前记录的数字;
3. 最重要特性:字典里面找不到单词不会报错,自动返回我们设置的默认值0。
拿 dict1.get(i,0) 举实例:
第一次读到单词jingle,空字典里面找不到,返回0,0+1=1,存入字典;
再次读到jingle,取出已经存好的数字,再加1。
整套思路:不用提前收集所有单词,一边循环、一边新增单词、一边统计数量。
网友这套写法更加简洁高效,这个思路和我们以前学习的列表推导式很像,整合代码,省去多余步骤。
两套代码共用函数 dict.items()
通俗解释:把字典里面一组一组【单词:次数】分开取出来,方便循环打印结果。
总结
书本 dict.fromkeys 方案:课本标准入门写法,流程一步一步分开,不容易报错,适合新手入门打基础。
网友 dict.get() 方案:实战精简写法,边走边处理数据,代码更加简短凝练。
初学阶段优先看懂书本标准写法;基础学扎实之后,就可以学习这种精简思路。
能够跳出课本,自己思考多种实现方案,代表编程思维真正建立起来了。
运行输出参考
jingle:6
bells:6
all:2
the:2
way:2
Oh:1
what:1
fun:1
it:1
is:1
to:1
ride:1
in:1
a:1
one-horse:1
open:1
sleigh:1
抖音号:筛过岁月,藏喜入怀
夜雨聆风