以命运.txt文件为例,统计字符串出现次数
原题
问题1
《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件,文件名为“命运. txt”。
问题1 (5分) :
在PY301-1. py文件中修改代码,对“命运. txt”文件进行字符频次统计,输出频次最高的中文字符(不包含标点符号)及其频次,字符与频次之间采用英文冒号”:”分隔,示例格式如下:
理:224.
# 以下代码为提示框架
# 请在...处使用一行或多行代码替换
# 请在______处使用一行代码替换
#
# 注意:提示框架代码可以任意修改,以完成程序功能为准
...
d = {}
...
print("{}:{}".format(______))
答案1
思路1
以下为处理该文本的基本思路
①:打开txt格式的文件
②:读取文件中的文字部分
③:根据文字建立字典,其中key为文字,key对应的值为该文字出现的次数
注:使用字典的get()函数来统计其频数
④:只读取文字(不读取其中的标点符号)
⑤:输出出现频次最高的文字,文字与对应出现次数之间使用 : 进行连接
代码1
f = open('命运.txt','r')
txt = f.read()
d = {} #此部分为题目给出的提示
for i in txt:
if i not in ",。:;【】《》?、“”‘’":
d[i] = d.get(i,0) + 1
d.sort(key = lambda x:x[1],reverse = True)
ls = list(d.items())
print("{}:{}".format(ls[0][0],ls[0][1]))
f.close()
问题2
问题2 (5分) :在PY301-2. py文件中修改代码,对“命运. txt”文件进行字符频次统计,按照频次由高到低,屏幕输出前10个频次最高的字符,不包含回车符,字符之间无间隔,连续输出,示例格式如下:
理斯卫… (后略,共10个字符)
...
d = {}
...
ls = list(d.items())
ls.sort(key=lambda x:x[1], reverse=True) # 此行可以按照词频由高到低排序
...
答案2
思路2
与题目1的主要区别在于:
① 不筛除标点符号,只筛除换行符号(\n)
② 输出出现频率排名前10的字符
代码2
f = open('命运.txt','r')
txt = f.read()
d = {}
for i in txt:
if i not in "\n":
d[i] = d.get(i,0) + 1
ls = list(d.items())
ls.sort(key = lambda x:x[1],reverse = True)
for k in range(10): #输出排名前十的字符串即可
print(ls[k][0])
问题3
问题3 (10分) :在PY301-3. py文件中修改代码,对“命运. txt”文件进行字符频次统计,将所有字符按照频次从高到低排序,字符包括中文、标点、英文等符号,但不包含空格和回车。将排序后的字符及频次输出到考生文件夹下,文件名为“命运-频次排序. txt”。字符与频次之间采用英文冒号”:”分隔,各字符之间采用英文逗号”,”分隔,参考CSV格式,最后无逗号,文件内部示例格式如下:
理:224,斯:120,卫:100
提示:建议使用本机提供的Python集成开发环境IDLE编写、 调试及验证程序。
答案3
思路3
特殊要求在于:
① 筛除空格和回车
② 字符和频次之间采用英文冒号:
③ 各字符之间采用英文逗号,
分割
④ 输出txt文件,文件名命名为:“命运-频次排序. txt”
答案3
f = open('命运.txt','r')
fi = open('命运-频次排序. txt','w')
txt = f.read()
d = {}
for i in txt:
if i not in " \n":
d[i] = d.get(i,0) + 1
ls = list(d.items())
ls.sort(key = lambda x:x[1],reverse = True)
s = ""
for k in ls:
s += "{}:{}".format(k[0],k[1]) + ','
fi.write(s[:-1])
f.close()
fi.close()
知识点总结
字典:.get()函数的作用
对字典d使用
d.get(i,0) + 1
表示获得d[i],如果该字典的键已经有i,则返回值为0,之后+1
一般都应用在循环遍历中,对出现的字符串逐个计数
字典:.items()返回的类型
对字典如d = {'a':1,'b':2}
使用d.items()返回dict_items类型
使用list(d.items())
可以得到如下格式的列表:键值对以元组形式组合,元组作为列表元素
[('a',1),('b',2)]
*注:注意区别d.items()和d.iteritem()的区别,主要是返回对象的类型不同:d.iteritem()返回的类型为generator
sort()函数的作用
sort()函数 与 sorted()函数均可对list进行排序
sort()函数与sorted()函数的区别:
①:sort 是应用在 list 上的方法,属于列表的成员方法,sorted 可以对所有可迭代的对象进行排序操作。
②:对于列表list,想要进行排序,要么使用ls.sort()
(list本身会改变),要么使用sorted(ls)
(list本身不会改变)
key的进阶使用:
sort()含有参数key,用来表示依据什么标准来对list进行排序
key = lambda x :x[1]
,
对于类似于[(a,1),(b,2),....]
这类形式的list
,
使用ls.sort(key = lambda x:x[1],reverse = True)
,即是将list根据对应的第二个值
(即:上述的lambda x:x[1]
)进行排序
reverse = True 代表降序;reverse = False 代表升序