1. 程式人生 > >Python 實用程式設計技巧(序列篇)

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】反正閒著也是閒著呢,不如學點東西啦~~