Python3實用編程技巧+案例

最近這幾天為了給大家寫幾篇Python的文章,營長特意重新拾起了好久沒玩的Python,給大家整理了Python常用的一些編程技巧。

下面就是幾個常用的很簡單的Python技巧,如果你還沒了解過,建議收藏一下,希望你能學到這一波操作。

文末附上了一些新更新的Python學習資源哦~

一、如何在列表,字典,集合中根據條件篩選數據?

問題1:

如何過濾掉列表[3,9,-1,10,20,-2]中的負數?

解決方法:

在Python中可以使用函數式編程,列表解析,字典解析集合解析等方式進行篩選。

1)最通常的方法:迭代

data = [3,9,-1,10,20,-2]res = []for x in data: if(x >= 0): res.append(x)print(res)

2)使用filter函數

from random import randintdata = [randint(-10,10) for x in range(10)] #在-10到10之間隨機生成10個隨機數newdata = list(filter(lambda x: x >= 0, data))print(newdata)

注意Python3中的filter函數返回的對象從列表改為了Iterator(迭代器),因此如果想返回一個列表,就要加上list()

3)列表解析

newdata2 = [x for x in data if x >= 0]print(newdata2)

結果和使用filter函數相同,但是使用列表解析所需的時間要比使用filter快很多,所以首選的方式就是列表解析,另外這兩種方式都遠快於迭代的方式。

問題2:

如何篩選出字典中值高於90的項?

解決方法:

from random import randintdic = {x: randint(60,100) for x in range(1,11)} #隨機生成學號1到10的學生成績newdic = {k:v for k,v in dic.items() if v >= 90} #同時迭代鍵和值,Python3中的iteritems變為itemsprint(newdic)

問題3:

如何篩選出集合{77,89,32,29,33}中能被3整除的元素?

解決方法:

s = {77,89,32,29,33}news = {x for x in s if x % 3 == 0}print(news)

二、如何為元組中的每個元素命名,提高程序的可讀性?

實際案例:

如學生信息管理系統中數據為固定格式:

(名字,年齡,性別...)

學生數量很大,為了減少存儲開銷,對每個學生信息採用元組表示:

(‘jam’,16,’male’)

(‘tom’,18,’male’)

(‘july’,19,’female’)

...

訪問元組時,需要使用索引(index)來訪問,

如一個學生元組為student = ('jam',19,'male'),那麼想要訪問其名字時要使用student[0],訪問其性別時要使用student[2]

由此帶來的問題是大量的索引會降低程序的可讀性,

那麼如何來解決這個問題呢?

有兩種解決方案

方案1:定義枚舉類型,也就是定義一系列數值常量

NAME = 0AGE = 1SEX = 2# NAME,AGE,SEX = range(1,4)student = ('jam',19,'male')print(student[NAME])print(student[AGE])

方案2:使用標準庫中collections.namedtuple替代內置的tuple

from collections import namedtupleStudent = namedtuple('student',['name','age','sex']) #相當於創建了一個命名元組類,第一個參數是元組的名字,第二個參數是其屬性s1 = Student('jam',18,'male') #可以直接傳參s2 = Student(name='tom',age=20,sex='male') #也可以通過關鍵字傳參print(s1.name) #通過屬性來訪問print(s2.age)

三、如何統計序列中元素的出現頻度?

問題1:

某隨機序列[12,5,6,4,6,5,5,7,...]中,找到出現次數最高的3個元素,它們出現次數是多少?

解決方法:

統計元素出現的次數

from random import randintdata = [randint(1,10) for x in range(30)] # 隨機生成30個1到10之間的數字# 為了方便地統計每個元素的頻率,可以使用字典# 初始構造一個字典,鍵是1到10,對應的初始值設為0c = dict.fromkeys(data,0) # {6: 0, 1: 0, 4: 0, 10: 0, 2: 0, 8: 0, 5: 0, 7: 0, 3: 0, 9: 0}# 然後遍歷data中的每個值,對應的鍵值加1即可for x in data: c[x] += 1print(c) # {10: 5, 1: 3, 4: 1, 7: 5, 8: 4, 6: 5, 2: 2, 9: 3, 3: 2}

為了找出出現次數最高的三個元素,可以使用collections.Counter對象,將序列傳入Counter的構造器,得到Counter對象是元素頻率的字典。Counter.most_common(n)方法得到頻率最高的n個元素的列表。

from random import randintfrom collections import Counterdata = [randint(1,10) for x in range(30)]c2 = Counter(data) #直接將data傳入Counter構造器print(c2) #c2就是每個元素的頻率的字典print(c2[10]) #得到數字10出現的頻率#輸出出現頻率最高的3個元素print(c2.most_common(3)) # [(6, 6), (10, 5), (1, 4)]

問題2:

對某英文文章的單詞進行詞頻統計,找到出現次數最高的3個單詞?

import refrom collections import Countertxt = '''In the entire would there is nobody like me.Since the beginning of time,there has never been another person like me.Nobody has my smile.Nobody has my eyes,my nose,my hair,my hands,or my voice.I am special'''c3 = Counter(re.split('\W+',txt)) # 以非單詞進行分割,統計出每個單詞的頻率print(c3)print(c3.most_common(3)) # 輸出頻率最高的3個單詞

四、如何根據字典中值的大小,對字典中的項進行排序?

案例:

某班英語成績以字典形式存儲為:

{‘LiLei’:79,’Jim’:88,’Lucy’:92...}

要根據成績高低,計算學生排名

解決方法:

使用Python的內置函數sorted進行排序,sorted函數通常用於對列表的排序,如sorted([2,1,5,9,3])

若對字典進行排序可先利用zip將字典數據轉化為元組在進行排序。

from random import randintdata = {x : randint(60,100) for x in 'abcxyz'} # 隨機生成一個學生成績的字典newdata = list(zip(data.values(),data.keys())) # 將成績放在前面便於sorted排序,先比較成績,成績相同時在比較鍵值print(newdata) # [(72, 'a'), (82, 'b'), (86, 'c'), (88, 'x'), (97, 'y'), (81, 'z')]print(sorted(newdata)) # [(72, 'a'), (81, 'z'), (82, 'b'), (86, 'c'), (88, 'x'), (97, 'y')]

第二種方式可以通過傳遞sorted函數的key參數進行排序

from random import randintdata = {x : randint(60,100) for x in 'abcxyz'} # 隨機生成一個學生成績的字典newdata = sorted(data.items(),key=lambda x: x[1]) # key的參數是一個函數,每次迭代data.items(),將每一項作為函數的參數,結果返回每一項的value值作為用於排序的key值print(newdata)

好啦,由於時間有限,今天暫時先給大家分享這幾個技巧,如果大家喜歡的話,後面我還會再整理分享一期,敬請關注!

寫在最後