Python 實用程式設計技巧(序列篇)
前言
Python 作為我們平時使用頻率最高的指令碼語言擁有著靈活、簡潔、高效的特點,但是實際上大多數情況下我們都沒有能夠發揮其最大的能力,於是分幾個部分總結一下程式設計的技巧,同時也期望對Python 有一個更深的認識。
有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~
1.如何在列表,字典,集合中篩選出指定條件的項
最簡單的方式就是迴圈
dict=[1,2,-2,3,-5,13,5.2] res=[] for i in dict: if i>0: res.append(i) print res
但是迴圈程式碼非常的臃腫並且執行的效率很低,於是我們考慮使用函數語言程式設計的方法(1)列表:
filter函式:
from random import randint
data = [randint(-10,10) for i in range(10)]
data = filter(lambda x:x>=0,data)
print data
列表解析:
from random import randint data = [randint(-10,10) for i in range(10)] data = [x for x in data if x>=0] print data
(2)字典
字典解析:
grade = {x:randint(60,100) for x in range(1,20)}
grade = {k:v for k,v in grade.iteritems() if v >90}
print grade
(3)集合
集合解析:
s = set([randint(-10,10) for i in range(10)])
s = {x for x in s if x%3==0}
print s
2.如何為元組中的每個元素命名來提高程式可讀性
因為元組結構簡單,訪問速度快,所以常常被我們用來存放結構一致的資料,但是他的訪問還是存在一些問題,比如我們想訪問元組中的元素的時候必須使用的是下標的方式,這樣就大大降低了程式的可讀性,於是我們需要找一個策略解決這個問題。
方法一:採用巨集定義或者列舉型別類似的方式
NAME,AGE,SEX,EMAIL = xrange(4)
student =("tom",16,"male","[email protected]")
print student[NAME]
print student[AGE]
print student[SEX]
print student[EMAIL]
注意:解釋一下 xange() 在這裡面的應用
xrange() 區別於 range() ,它會生成一個生成器,然後這裡面又利用了列表的拆包原理進行了迴圈的賦值
方法二:使用namedtuple這個模組建立一個命名元組
from collections import namedtuple
Student = namedtuple("Student",['name','age','sex','email'])
s = Student("tom",16,"male","[email protected]")
print s
print s.age
上面我們使用的是位置傳參的方式,我們還能使用關鍵字進行傳參,這樣就不用位置一一對應
3.如何根據字典的鍵值對字典的元素進行排序
方法一:使用 sorted() 方法的key 引數
from random import randint
data = [randint(0,20) for i in range(30)]
s = dict.fromkeys(data,0)
for i in data:
s[i]+=1
print sorted(s.items(),key=lambda x:x[1])
引數解釋:
(1)items()可將字典中的每個鍵值對轉換成一個一個的元組,並將這些元組組合成一個list。 (2)key值的傳入,我們這裡使用匿名函式lambda,利用這個函式,我們可以對字典進行按鍵、按值排序,即x[0]則為按鍵排序,x[1]則為按值排序。
方法二:使用zip()將字典鍵值對互換排列
因為 sorted() 是按照先比較第一個值在比較第二個值的方式進行比較的,於是我們在轉化成元組列表的時候需要對鍵值對互換
因為我們能通過字典的 keys 和 values 方法分別獲得鍵值對的列表,而 zip 正好能將多個列表重組成為元組列表。
from random import randint
data = [randint(0,20) for i in range(30)]
s = dict.fromkeys(data,0)
for i in data:
s[i]+=1
print sorted(zip(s.values(),s.keys()))
4.如何統計序列中出現的元素的頻度
方法一:先轉化成字典
最開始我們的方法可以是將一個序列的值作為字典的鍵,然後鍵對應的值預設是0,我們在利用迴圈遍歷整個序列,不斷的為字典的值加一
from random import randint
data = [randint(0,20) for i in range(30)]
s = dict.fromkeys(data,0)
for i in data:
s[i]+=1
print s
我們現在有了字典以後就需要根據字典的值對結果進行排序
方法二:使用 collections 的 Counter 方法
經過 Counter 方法包裝過的字典自帶了一個叫做most_common 的方法,能直接找到出現頻率較高的的指定個數的元素
from random import randint
from collections import Counter
data = [randint(0,20) for i in range(30)]
s = dict.fromkeys(data,0)
for i in data:
s[i]+=1
print Counter(s).most_common(3)
例項: 統計LICENCE 檔案中出現頻率最多的單詞
import re
from collections import Counter
txt = open('LICENCE').read()
print Counter(re.split('\W+',txt)).most_common(10)
結果: [(‘the’, 309), (‘of’, 210), (‘to’, 177), (‘a’, 171), (‘or’, 138), (‘you’, 106), (‘work’, 97), (‘that’, 91), (‘and’, 91), (‘in’, 76)]
4.如何快速找到字典中的公共鍵
方法一:按照一個字典的鍵值進行遍歷
我們最簡單的思路就是找按照一個字典的鍵進行遍歷,然後判斷是不是在另外的字典中
from random import randint,sample
s1 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
s2 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
s3 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
res = []
for x in s1:
if x in s2 and x in s3:
res.append(x)
print res
方法二:使用集合的交集操作
集合有一個內建的方法就是 viewkeys 能夠以集合的形式顯示出來所有的鍵值
from random import randint,sample
s1 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
s2 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
s3 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
print s1.viewkeys() & s2.viewkeys() & s3.viewkeys()
方法三:使用函數語言程式設計 map() 和 reduce() 配合
reduce() 在兩兩進行操作的時候的作用非常的大
from random import randint,sample
s1 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
s2 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
s3 = {i:randint(1,4) for i in sample('abcdefg',randint(1,7))}
res = reduce(lambda x,y:x&y,map(dict.viewkeys,[s1,s2,s3]))
print res
5.如何讓字典保持有序
使用 collections 下面的 OrdetredDict方法
from collections import OrderedDict
d = OrderedDict()
d['Jim'] = (1,20)
d['Bob'] = (2,30)
d['Keen'] = (3,40)
for i in d:
print i
6. 如何實現顯示使用者的歷史記錄功能
方法一:使用容量為n的佇列
使用collections 中的 deque 方法
from collections import deque
q = deque([],5)
q.append(1)
q.append(2)
print q
但是這個方法有一個弊端,就是我們目前是把記錄儲存在記憶體中的,一旦程式退出就消失了,於是我們需要使用檔案進行儲存
方法二:使用 pickle 這個工具
pickle 能將python 物件存入檔案中,還能將該物件從檔案中還原出來
from collections import deque
import pickle
q = deque([],5)
q.append(1)
q.append(2)
pickle.dump(q,open('history','w'))
q2 = pickle.load(open('history'))
print q2
有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~