首页编程Python文章详细

Python文本字符统计与排序应用

原创 2023-03-17 21:21:12 564

python-banner.jpg

3个Python源文件,分别对应3个问题;1个文本文件,作为本题目输入数据,请按照源文件内部说明修改代码,实现以下功能:《卖火柴的小女孩》是丹麦童话故事作家安徒生的一篇童话故事,发表于1846年。主要讲了一个卖火柴的小女孩在富人阖家欢乐、举杯共庆的大年夜冻死在街头的故事。这里给出《卖火柴的小女孩》的一个网络版本文件,文件名为“小女孩.txt”。

 

问题1,对“小女孩.xt”文件进行字符频次统计,输出频次最高的中文字符(不包含标点符号及其频次将输出结果保存在考生文件夹下,命名为“PY301-1.txt”。字符与频次之间采用英文冒号”:"分隔,示例格式如下:

的:83

代码如下:

fi = open("小女孩.txt","r")
fo = open("PY301-1.txt","w")
txt = fi.read()
d = {}
exclude = ",。!?、()【】<>《》=:+-*-“”…"
for word in txt:
    if word in exclude:
        continue
    else:
        d[word] = d.get(word,0) + 1
ls = list(d.items())
ls.sort(key=lambda x:x[1],reverse=True)
fo.write("{}:{}".format(ls[0][0],ls[0][1]))
fo.close()
fi.close()

【解题思路】

(1)首先使用openO函数打开文件“小女孩.txt”,把文件的内容通过readO方法保存到变量txt中;定义一个字符串变量exclude用来存放标点符号。然后用for循环遍历txt中的每个字符(word】并使用if条件进行判断,若该字符在变量exclude中,说明该字符为标点符号,跳出该循环;否则将该字符作为字典d中的一个键,该键所对应的值置为1,在后面循环中只要遍历的字符与该键相同,就将该键对应的值加1。

ls=list(d.itemsO)表示将字典类型变成列表类型,字典中的每个键值对对应列表中的一个元组。随后,对列表1s中的元组进行排序,用到sortO方法, 参数“key=lambda x:x[1l”中lambda早- 隐函数,是固定写法,不能写成别的单词;x表示列表中的一个元素,在这里表示一个元组,x只是临时起的一个名字,也可以使用任意的名字;x[1]表示以元组中第二个元素排序。sortO方法的第二参数表示是按哪种方式排序,若为“reverse=True”表示按降序排序;若该参数缺省或“reverse=False”,表示按升序排序。

排序后,列表1s中第一个元组中即为频次最高的中文字符和频次,ls[0][0]表示该字符,Is[0][1]表示其频次,将这两个元素通过“."连接写入文件“PY301-1.txt”中。

python-line.jpg

问题2,对“小女孩.txt”文件进行字符频次统计,按照频次由高到低,输出前10个频次最高的字符,不包含回车符,字符之间无间隔,连续输出,将输出结果保存在考生文件夹下,命名为

PY301-2.txt”。示例格式如下:

,的一..(后略,共10个字符)


代码如下:

fi= open("小女孩.txt","r")
fo = open("PY301-2.txt","w")
txt = fi.read()
d = {}
for word in txt:
    d[word] = d.get(word,0) + 1
del d["\n"]
ls = list(d.items())
ls.sort(key=lambda x:x[1], reverse=True) # 此行可以按照词频由高到低排序
for i in range(10):
    fo.write(ls[i][0])
fo.close()
fi.close()

【解题思路】

(2)问题2和问题1的区别在于统计的字符包含标点符号,因此不需要设置字符串变量exclude和使用iE条件语句进行判断;题目要求不包含回车符,因此需要使用del删除字典d中键为"in"的元素。最后要无间隔输出前10个频次最高的字符,需要对排序好的列表1s进行for循环遍历,找到前10个元组的第一个元素,并将其直接写入到文件“PY301-2.txt”中。 

python-line.jpg

问题3,对“小女孩.txt”文件进行字符频次统计,将所有字符按照频次从高到低排序,字符包括中文、标点、英文等符号,但不包含空格和回车。将排序后的字符及频次输出到考生文件夹下,文件名为“小女孩-频次排序.txt"。字符与频次之间采用英文冒号":"分隔,各字符之间采用英文逗号","分隔,参考CSV格式,最后无逗号,文件内部示例格式如下:

着:30.那:29火:29


代码如下:

fi = open("小女孩.txt","r")
fo = open("小女孩-频次排序.txt","w")
txt = fi.read()
d = {}
for word in txt:
    d[word] = d.get(word,0)+1
del d[" "]
del d["\n"]
ls = list(d.items())
ls.sort(key=lambda x:x[1], reverse=True) # 此行可以按照词频由高到低排序
for i in range(len(ls)):
    ls[i] = "{}:{}".format(ls[i][0],ls[i][1])
fo.write(",".join(ls))
fi.close()
fo.close()

【解题思路】

(3)问题3和问题2的区别在于统计的字符中不能包含空格,因此需要使用de1删除字典d中键为空格的元麦最后要将所有字符和

其频次输出,需要对排序好的列表ls进行for循环遍历,遍历列表中的每个元组,并将元组中的两个元素通过“:”连接,再用逗号分隔每个字符写入到文件“小女孩频次排序.txt”中。


推荐