程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

計數問題 兩行代碼解決 Python

編輯: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出現的次數。

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


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved