计数问题 两行代码解决 Python

目录

传统版本

题目描述

传统思路

传统代码

封神版本 

两行代码

二次改进 

三次改进

代码分析

列表推导式

str()函数 

str.join()函数 

str.strip()函数

str.count()函数


传统版本

题目描述

试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。

输入输出格式

输入格式:

输入共 1 行,包含 2 个整数 n、x,之间用一个空格隔开。

输出格式:

输出共 1 行,包含一个整数,表示 x 出现的次数。

输入输出样例

输入样例#1: 

11 1

输出样例#1: 

4

传统思路

对于每一个数,我们首先将它按位数划分出来,提取它的各个位数,一一比对就行。

具体操作就是:两个循环,外循环实现从1到n的所有整数,内循环实现每一个整数的各位上的数字比对,采用和10取余的方式取出它的各位,一次和10取余可以取出个位上的数字,之后让其除以10,就可以把十位上的数字拉到各位,如此反复直到它为0.

要注意Python中的 / 不只是整除,python不是静态类型语言,数据类型是在程序执行过程中确定的,所以我们需要把结果强制转换成整型来操作。

传统代码

m,n=map(int,input().split())
count=0
for i in range(1,m+1):
    temp=i
    while temp:
        if temp%10==n:
            count=count+1
        temp=int(temp/10)
print(count)

封神版本 

两行代码

n,x=map(int,input().split())
print((("".join([str(i) for i in range(0,n+1)])).strip()).count(str(x),0))

二次改进 

n,x=map(int,input().split())
print(str([i for i in range(n+1)]).strip().count(str(x),0))

三次改进

n,x=map(int,input().split())
print(str([i for i in range(n+1)]).count(str(x)))

代码分析

重要的不是只有两行代码,重要的是,这两行代码是怎么写出来的。

为了方便大家阅读以及我个人讲解,我采用高一学习复杂英语句子的方式来给大家剥蚕抽丝。

首先划分结构,为了方便理解,我把这两行代码拆开成下面这个模样:

n,x=map(int,input().split())

a=[str(i) for i in range(0,n+1)]

b=("".join(a))

c=(b.strip())

d=c.count(str(x),0) print(d)

然后是逐个知识点分析,个人感觉学Python就是学它的各种库函数的过程。

首先是列表推导式

列表推导式

列表推导式简单的来说,就是用简洁的代码快速创建出列表的方式,如果你不知道什么是列表,请看浅谈Python列表及其增删改查_^o^叶子^0^的博客-CSDN博客_python列表的增删改查

好了,举个列表推导式的使用例子:

比如说我们想创建一个列表[0,1,2,3,4,5,6,7,8,9],常规的操作是这样的:

a=[]

for i in range(10): a.append(i)

print(a)

但是使用列表推导式可以一行代码搞定:

print([i for i in range(10)])

当然,列表推导式知识博大精深,远远不止这些东西,但是和我们这里的计数问题相关不大,有机会再聊,而且随着Python的发展,也出现了与之对应的字典推导式和集合推导式,这里不多说。我们进入下一个知识点,str()函数。

str()函数 

这个就很简单了,它就是,把括号里面东西的变成字符(串),像我们代码中的

[str(i) for i in range(0,n+1)]

就是创建0到n的一堆数字字符,那为什么要字符类型的呢?因为后面会解释到^_^。

好了,我们进入下一个内容,str.join()函数

str.join()函数 

对于一些很简单的事情,我们往往不解释而直接给出结果:

print('^_^'.join('000000000'))

 再看:

print('¥'.join('我并不知道要做什么'))

其实就是将后面的以前面的作为间隔分开再拼成字符串。

对于列表、字典、集合也适用:

print('   '.join(['I','love','you','!']))

我们代码中的"".join()就是不间隔开直接拼起来。

咦,好像也不需要用到join,我为啥不直接用str()转字符串呢?

好了,经实践表明,这个也可以实现:

n,x=map(int,input().split())
print(str([i for i in range(n+1)]).strip().count(str(x),0))

我……,这个看起来还简单一点,我真是服了T_T……

好了,来到str.strip()函数

str.strip()函数

这个函数就是去掉首尾指定的字符,嗯……嗯!!!

但是好像在这里没用啊T_T……

这一天天的,我在干什么!

好了,来到我们文章的末尾的count函数

str.count()函数

这个函数就很优秀了,它可以用来统计字符串里面某个字符(串)出现的次数。

比如:count('X',3,7)就可以统计从第四个字符到第8个字符之间X出现的次数。

完事,再修改一下下,完美。

猜你喜欢

转载自blog.csdn.net/weixin_62264287/article/details/126069288