读取附件是一篇英文短文,请编写程序统计这篇短文前 n 行中每一个英文字母出现的次数,结果按次数降序排列,次数相同时,按字母表顺序输出。若 n 值大于短文行数,输出整篇文章中每一个英文字母出现的次数(大写字母按小写字母统计)。
输入一个正整数 n
分行输出每个字母的数量,数量占3个字符宽度,居右对齐(参考示例输出)
输入: 10
输出: e 的数量是 179 个 a 的数量是 125 个 t 的数量是 121 个 h 的数量是 116 个 o 的数量是 101 个 s 的数量是 92 个 i 的数量是 91 个 n 的数量是 88 个 d 的数量是 77 个 r 的数量是 60 个 l 的数量是 49 个 f 的数量是 46 个 w 的数量是 45 个 m 的数量是 41 个 y 的数量是 40 个 u 的数量是 35 个 c 的数量是 32 个 b 的数量是 29 个 g 的数量是 20 个 k 的数量是 19 个 p 的数量是 13 个 v 的数量是 9 个 q 的数量是 1 个 x 的数量是 1 个 j 的数量是 0 个 z 的数量是 0 个
开始你的任务吧,祝你成功!
代码:
def filename(text,n):
with open(text,'r',encoding='utf-8') as f:
global lst
lst=[line.strip('\n') for line in f]
def fread(long):
string=''.join(long).lower()
text={}
for i in string:
if i.isalpha():
if i in text:
text[i]+=1
else:
text[i]=1
return text
def re_sorted(dic):
for line in 'abcdefghijklmnopqrstuvwxyz':
counter=dic.get(line,0)
dic[line]=counter
text=dict(sorted(dic.items(),key=lambda x:(-x[1],x[0])))
for i in text:
print('{} 的数量是 {:>3} 个'.format(i,text[i]))
text='step2/The Old Man and the Sea.txt'
n=int(input())
filename(text,n)
dic=fread(lst[:n])
re_sorted(dic)
这是一个使用 Python 编写的程序,它可以从文本文件中读取前 n 行,然后统计每个英文字母出现的次数,并按次数降序排列,次数相同时,按字母表顺序输出。
这个程序定义了三个函数:`filename`,`fread` 和 `re_sorted`。
filename:按要求读取文件的前n行,注意使用了全局变量lst,结果输出是一个字符串。可以用print(lst)验证。
fread:读取第一个函数定义全局变量lst,将字符串变为字典形式。用来统计这个字符串所有字母出现的次数。并最后返回字典结果。
re_sorted:使用第二个函数得到的字典结果,用dic表示。接着遍历26个英文字母,使用get方法得到每一个字母所对应的个数,若出现不存在的字母,则返回字母个数为0,最后将所得到的个数返回给counter变量。再使用dic[line],将键值line对应的value值修改为counter的个数。(可以理解为是在字典里面添加当中有些字母没有的26个字母)。再然后,这个函数会按照出现次数对字典进行倒序排序,并按照格式输出每个字母及其出现次数。
在 Python 中,字典是一种可变的、无序的、可迭代的数据类型,它存储键值对。字典中的键必须是唯一的,而值可以是任意类型的数据。你可以使用大括号 {}
或 dict()
函数来创建一个空字典,也可以使用大括号 {}
来创建一个非空字典。
用法举例:
# 创建一个非空字典
d = {'a': 1, 'b': 2, 'c': 3}
# 获取键为 'a' 的值
print(d.get('a')) # 输出: 1
# 获取键为 'd' 的值,如果不存在则返回默认值 0
print(d.get('d', 0)) # 输出: 0
1.统计短文里出现的每个字母的次数。
text={}
for i in string: //string是我们得到的短文信息
if i.isalpha(): //判断i是否是字母
if i in text:
text[i]+=1 //就比如是text['a'],它相当于在text这个空字典里面添加了{‘a’:1}
else:
text[i]=1
//注意:text[i]代表的键i对应的值。若字典不存在i,它会先创建一个键i,再执行赋值语句。
比如说:
我们要得到text的所有键,则输入:[i for i in text]
如果要得到text的所有值,则输入:[text[i] for i in text]
2.输出字典(改变字典的键,输出对应值的结果)
在上一个代码的基础上输出:
for i in text:
print('{}的数量是{:>3}个'.format(i,text[i]))
text是一个字典,i表示键,text[i]表示值。
3.对字典进行排序(重点)
有两种方式,一种是按键排序,另一种是按值排序。
我们首先介绍按值排序:dic是字典
text=dict(sorted(dic.items(),key=lambda x:x[1],reverse=True))
这行代码使用了 `sorted` 函数和 `dict` 函数来对字典 `dic` 中的键值对进行排序,并创建一个新的字典。
`sorted` 函数接受一个可迭代对象作为参数,并返回一个新的排序后的列表。在这个例子中,`sorted` 函数的参数是 `dic.items()`,它返回一个包含字典中所有键值对的视图对象。每个键值对都是一个元组,第一个元素是键,第二个元素是值。
`sorted` 函数还接受一个可选参数 `key`,它指定了排序的依据。在这个例子中,`key` 参数的值是一个 lambda 函数,它接受一个参数 `x`(表示字典中的一个键值对),并返回 `x[1]`(表示字典中键对应的值)。这意味着 `sorted` 函数会按照字典中每个键对应的值进行排序。
`sorted` 函数还接受一个可选参数 `reverse`,它指定了排序的顺序。如果 `reverse` 的值为 `True`,则按照降序排列;否则按照升序排列。在这个例子中,`reverse` 的值为 `True`,所以 `sorted` 函数会按照降序排列。
最后,这行代码使用 `dict` 函数将排序后的列表转换为一个新的字典,并将其赋值给变量 `text`。
总之,这行代码的作用是按照字典 `dic` 中每个键对应的值进行降序排列,并创建一个新的字典。
对键的排序和上一种差不多的方式,将x[1]改为x[0]就可以了。
再看一下这种方式,对键和值都进行排序:
text=dict(sorted(dic.items(),key=lambda x:(-x[1],x[0])))
关键在于可选参数key的定义:它返回一个元组(-x[1],x[0]),则代表 `sorted` 函数会先按照字典中每个键对应的值(取负数)进行排序,然后按照字典中的键进行排序。
因为元组的第一个参数使用负数,则表示降序排列值;第二个参数为正数,则表示升序排列键。
而又因为第一个参数的排列在前面,所以我们要先按照降序排列好值,再然后看第二个参数(就是在一个参数有相同的值的时候,就使用第二个参数的方法进行排序)