7-1 jmu-Java&Python-统计文字中的单词数量并按出现次数排序 (25 分)

29 篇文章 19 订阅
7 篇文章 1 订阅
该博客介绍了如何使用Python处理英文文本,统计单词数量并按出现频率排序。通过示例代码展示了如何利用lambda函数和sorted方法实现忽略标点、大小写的单词计数,以及对结果进行排序。内容涵盖了Python的基础语法和数据处理技巧。
摘要由CSDN通过智能技术生成

现在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数

注1:单词之间以空格(1个或多个空格)为间隔。
注2:忽略空行或者空格行。

基本版:
统计时,区分字母大小写,且不删除指定标点符号。

进阶版:

  1. 统计前,需要从文字中删除指定标点符号!.,:*?。 注意:所谓的删除,就是用1个空格替换掉相应字符。
  2. 统计单词时需要忽略单词的大小写。

输入说明

若干行英文,最后以!!!!!为结束。

输出说明

单词数量
出现次数排名前10的单词(次数按照降序排序,如果次数相同,则按照键值的字母升序排序)及出现次数。

输入样例1

failure is probably the fortification in your pole

it is like a peek your wallet as the thief when you
are thinking how to spend several hard-won lepta

when you are wondering whether new money it has laid
background because of you then at the heart of the

most lax alert and most low awareness and left it

godsend failed
!!!!!

输出样例1

46
the=4
it=3
you=3
and=2
are=2
is=2
most=2
of=2
when=2
your=2

结尾无空行

输入样例2

Failure is probably The fortification in your pole!

It is like a peek your wallet as the thief when You
are thinking how to. spend several hard-won lepta.

when yoU are? wondering whether new money it has laid
background Because of: yOu?, then at the heart of the
Tom say: Who is the best? No one dare to say yes.
most lax alert and! most low awareness and* left it

godsend failed
!!!!!

结尾无空行

输出样例2

54
the=5
is=3
it=3
you=3
and=2
are=2
most=2
of=2
say=2
to=2

结尾无空行

解析:

这个题目主要难在sorted的运用,其实我也不是很会用这个,我今天仔细研究了一下这个。

 引用一下sorted简单介绍,同样的,我这里也要引用lambda的说明,因为排序也需要lambda的使用,下面为引用:


sorted:

sorted(iterable, key=None, reverse=False) 
  • iterable -- 可迭代对象。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

lambda:

 lambda arg1,arg2,.....argn:expression

lambda 即匿名函数


ok,那我们就可以来听听我来讲这个了:

那我们先从简单的开始:

lambda:匿名函数,即使引入字符按照表述进行变化,即如果我写一个

f=lambda x:x*(-1)

那么我写的其实就等于:

def f(x):
    x=-1*x

那这就很显而易见了。

这个理解之后,我们进行分析sorted:

         那我们来分析一下括号里的内容吧:                

iterable -- 可迭代对象。即像列表、元祖、字典等这种都可以使用,这个就是与sort的第一个不同,适用范围更大。

key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。即,我们可以自定义一个函数,然后迭代即按照这个函数值来排序。

reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。即由我们来选择升序or降序排序。

这里我们大概就会有一些自己的想法了:那我们就以这个题目为例,来实践一下吧:

我们先思考我们的迭代对象是什么呢?如果只按照值排序,那就是dict.items()对吧,然后key呢?我们需要用用产生的列表中的元组的第二个值进行排序(即用值排序),那我们补齐试试

sorted(dict.items(), key=lambda item: item[1], reverse=True)

能理解可以跳过这个模块: 

我觉得我需要仔细讲一下这个key,第一点,这里是个函数,即我们通过每一项(每一项都是元组)的第二个(即原来字典的值)进行排序

即 

lambda i: i[1]               #和lambda item: item[1]一样,学懂了吗?

那么下面的,我们接着来吧

 然后同理,我们如果用值和键进行排序的话只需要变一下key,key这边需要我们先排序值,再排序键(key=lambda item: (item[1],-item[0])放在前的为首要排序,后为次要),那就这样:

sorted(dict.items(), key=lambda item: (item[1],-item[0]), reverse=True)

既然上面说了,reverse有默认值,那我们可以偷一下懒:

sorted(dict.items(), key=lambda item: (-item[1],item[0]))

那我们就成功解决了lambde和sorted了。大家可以去完成这个题目,来看看自己掌握的怎么样呀! 

答案:

# Description: 命里有时终须有,命里无时莫强求
# Autor: Neptune
# Date: 2021/11/10 17:17
dict1 = {}
sum1 = 0
while True:
    str = input()
    lis = list(str.lower().split())
    if len(lis) == 0:
        continue
    else:
        if "!!!!!" in lis:
            break
        for i in lis:
            for q in "!.,:*?":
                i = i.replace(q, '')
            if i.lower() in dict1:
                dict1[i.lower()] += 1
            else:
                dict1[i.lower()] = 1
sum1 = len(dict1)
print(sum1)
sum1 = 0
for i in sorted(dict1.items(), key=lambda x: (-x[1], x[0])):    #对dict1先用item排序,然后将出来的列表中的每一个元组,用首项正排序,第二项逆排序
    if sum1 == 10:
        break
    print("%s=%s" % (i[0], i[1]))
    sum1 += 1

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值