头哥作业:统计字母数量

统计字母数量 


任务描述

读取附件是一篇英文短文,请编写程序统计这篇短文前 n 行中每一个英文字母出现的次数,结果按次数降序排列,次数相同时,按字母表顺序输出。若 n 值大于短文行数,输出整篇文章中每一个英文字母出现的次数(大写字母按小写字母统计)。

输入格式

输入一个正整数 n

输出格式

分行输出每个字母的数量,数量占3个字符宽度,居右对齐(参考示例输出)

示例 1

输入: 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` 函数会先按照字典中每个键对应的值(取负数)进行排序,然后按照字典中的键进行排序。

因为元组的第一个参数使用负数,则表示降序排列值;第二个参数为正数,则表示升序排列键。

而又因为第一个参数的排列在前面,所以我们要先按照降序排列好值,再然后看第二个参数(就是在一个参数有相同的值的时候,就使用第二个参数的方法进行排序)

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值